第六天打卡,今天继续上次的网页爬取的内容,上次分析了相关的参数内容,这次我在网上查找了相关的爬虫请求ajax的请求,完成数据的爬取。
其中我才用的是scrapy 的爬虫模板来进行的爬取相关的网页,其中遇到了一些问题通过询问同学以及上网查询,最收取到了相关的信息。
爬取源代码:
import json import random import string import scrapy class LetterSpider(scrapy.Spider): name = 'Letter' allowed_domains = ['www.beijing.gov.cn'] # custome_setting可用于自定义每个spider的设置,而setting.py中的都是全局属性的,当你的 # scrapy工程里有多个spider的时候这个custom_setting就显得很有用了 custom_settings = { "DEFAULT_REQUEST_HEADERS": { 'authority': 'www.beijing.gov.cn', # 请求报文可通过一个“Accept”报文头属性告诉服务端 客户端接受什么类型的响应。 'accept': 'application/json, text/javascript, */*; q=0.01', # 指定客户端可接受的内容编码 'accept-encoding': 'gzip, deflate', # 指定客户端可接受的语言类型 'accept-language': 'zh-CN,zh;q=0.9', 'Connection': 'keep-alive', 'Content-Type': 'text/json', # 跨域的时候get,post都会显示origin,同域的时候get不显示origin,post显示origin,说明请求从哪发起,仅仅包括协议和域名 'origin': 'http://www.beijing.gov.cn', # 表示这个请求是从哪个URL过来的,原始资源的URI 'referer': 'http://www.beijing.gov.cn/hudong/hdjl/com.web.search.mailList.flow', # 设置请求头信息User-Agent来模拟浏览器 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36', 'x-requested-with': 'XMLHttpRequest', # cookie也是报文属性,传输过去 'cookie': 'HDJLJSID=39DBD6D5E12B9F0F8834E297FAFC973B; __jsluid_h=e6e550159f01ae9aceff30d191b09911; sensorsdata2015jssdkcross=%7B%22distinct_id%22%3A%2216f9edc47471cb-0059c45dfa78d6-c383f64-1049088-16f9edc474895%22%7D; _gscu_564121711=80128103kc5dx617; X-LB=1.1.44.637df82f; _va_ref=%5B%22%22%2C%22%22%2C1580462724%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DM-f5ankfbAnnYIH43aTQ0bvcFij9-hVxwm64pCc6rhCu5DYwg6xEVis-OVjqGinh%26wd%3D%26eqid%3Dd6b151bf000cfb36000000025e1c5d84%22%5D; _va_ses=*; route=74cee48a71a9ef78636a55b3fa493f67; _va_id=b24752d801da28d7.1578917255.10.1580462811.1580450943.', # 就是告诉服务器我参数内容的类型 } } # 需要重写start_requests方法 def start_requests(self): # 网页里ajax链接 url = "http://www.beijing.gov.cn/hudong/hdjl/com.web.search.mailList.mailList.biz.ext" # 所有请求集合 requests = [] # 这里只模拟一页range(0, 1) for i in range(0, 33750,1000): random_random = random.random() # 封装post请求体参数 my_data = {'PageCond/begin': i, 'PageCond/length': 1000, 'PageCond/isCount': 'true', 'keywords': '', 'orgids': '', 'startDate': '', 'endDate': '', 'letterType': '', 'letterStatue': ''} # 模拟ajax发送post请求 request = scrapy.http.Request(url, method='POST', callback=self.parse_model, body=json.dumps(my_data), encoding='utf-8') requests.append(request) return requests def parse_model(self, response): # 可以利用json库解析返回来得数据,在此省略 jsonBody = json.loads(response.body) # 拿到数据,再处理就简单了。不再赘述 print(jsonBody) size = jsonBody['PageCond']['size'] data = jsonBody['mailList'] listdata = {} for i in range(size): print(i) listdata['letter_type'] = data[i]['letter_type'] listdata['original_id'] = data[i]['original_id'] listdata['catalog_id'] =str(data[i]['catalog_id']) listdata['letter_title'] = data[i]['letter_title'] listdata['create_date'] = data[i]['create_date'] listdata['org_id'] = data[i]['org_id'] listdata['letter_status'] = data[i]['letter_status'] listdata['isreply'] = data[i]['isReply'] yield listdata print(listdata)源代码
这个代码还有一些地方没有看懂,只是尝试运行可以是实现,之后将研究下具体代码的作用,这个代码着实让我有点费劲。最后附一张我费了半天劲弄出来的三万多条数据。