用python爬取中国保护知识产权网
参考原文:https://blog.csdn.net/hua_you_qiang/article/details/114893483
爬取目标
本次爬取的是国际新闻部分。需要爬取的是文章标题,对应的url、日期和内容。
步骤
导库
import re
import os
import requests
import lxml
from bs4 import BeautifulSoup
import csv
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36 FS"}
找寻爬取规律
我们可以发现改变网址的对应1可以翻页
而获取新闻列表的方式我们选用post获取XML获取对应json。
而这个post方式需要提交数据
所以我们可以写一个get_json函数来获取对应每页列表的内容内容
data = {'pageNumber':str(i),
'cid':'gjxw'
}
def get_json(data):
url = 'http://ipr.mofcom.gov.cn/ipr/front/www/listN'
r = requests.post(url=url,headers=headers,data=data)
r.status_code = r.apparent_encoding
return r.json()
返回的就是json格式的数据
然后我们研究他的json数据可以发现:
我们要找的数据在pageInfo下的rows,里面每一个键值对记录的就是对应的标题文章的信息:
之后我们写一个get_detail_data函数去把对应值中的title,详情内容url和时间保存在list列表中返回
def get_detail_data(jsondata):
list = []
head_url ='http://ipr.mofcom.gov.cn/'
for each in jsondata['pageInfo']['rows']:
list.append((each['title'], head_url+each['url'], str(each['publishTimeStr'])))
return list
这样我们就得到了一个包含对应页数的文章列表的简要信息(标题,时间,内容网址)
通过内容网址找内容
我们获取到了list列表每个网址的内容可以通过for循环去遍历寻找文章内容,然后保存下来。此时我们使用get就可以获取到相应文章内容。
我们写了一个get_html函数去获取对应url的文章内容:
def get_html(url):
try:
r = requests.get(url=url,headers=headers)
r.encoding = r.apparent_encoding
return r.text
except Exception as result:
print('错误原因:',result)
return ''
定位到文章内容,可以发现在section class=“artCon” 包含我们所爬取的内容
我们写了一个get_article去获取对应的文章内容并写入文章保存:
def get_article(text,fp):
soup = BeautifulSoup(text,'lxml')
article = soup.find('section',attrs={'class':'artCon'})
for each in article.find_all('p'):
if each.string:
fp.writelines(each.string)
fp.close()
大致的思路就是如上,然后通过循环遍历去爬取list中每个文章的内容。如果需要爬取多页则多次post提交。
实验完整代码
import re
import os
import requests
import lxml
from bs4 import BeautifulSoup
import csv
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.190 Safari/537.36 FS"}
'''
获取列表信息
'''
def get_json(data):
url = 'http://ipr.mofcom.gov.cn/ipr/front/www/listN'
r = requests.post(url=url,headers=headers,data=data)
r.status_code = r.apparent_encoding
return r.json()
def get_detail_data(jsondata):
list = []
head_url ='http://ipr.mofcom.gov.cn/'
for each in jsondata['pageInfo']['rows']:
list.append((each['title'], head_url+each['url'], str(each['publishTimeStr'])))
print(list)
return list
'''
获取对应文章信息
'''
def save_title_url_time(all_list):
path = '../file/'
header = ['标题', 'url', '日期']
if not os.path.exists(path):
os.makedirs(path)
with open(path+'国际新闻.csv', 'w', newline="") as fp:
f_csv = csv.writer(fp)
f_csv.writerow(header)
f_csv.writerows(all_list)
print("OK")
def get_article(text,fp):
soup = BeautifulSoup(text,'lxml')
article = soup.find('section',attrs={'class':'artCon'})
for each in article.find_all('p'):
if each.string:
fp.writelines(each.string)
fp.close()
def get_html(url):
try:
r = requests.get(url=url,headers=headers)
r.encoding = r.apparent_encoding
return r.text
except Exception as result:
print('错误原因:',result)
return ''
def savefile(url,title):
key ='国际新闻'
if not os.path.exists(f'../file/{key}'):
os.mkdir(f'../file/{key}')
try:
everytext = get_html(url)
if not everytext:
print("为空,写入失败")
else:
title = filename_is_leagal(title)
fp = open(f'../file/{key}/{title}.txt','w',encoding='utf-8')
get_article(everytext,fp)
except Exception as result:
print('错误原因:',result)
def filename_is_leagal(filename):
unstr = ['?','<','>','"',':','|','/','\\','*']
for i in unstr:
if i in filename:
filename = filename.replace(i,',')
return filename
'''
main
'''
listdetail = []
for i in range(1,4):
data = {'pageNumber':str(i),
'cid':'gjxw'
}
jsondata = get_json(data)
listdetail += get_detail_data(jsondata)
save_title_url_time(listdetail)
for each in listdetail:
savefile(each[1],each[0])
|