最近挤了点时间,写了个爬虫,可能以后工作中能用得上。关于scrapy框架的一些基础知识这里就不再赘述,这里主要记录下开发思路。
关于项目背景:
http://jst.sc.gov.cn/xxgx/Enterprise/eList.aspx从这个网站中查询建筑企业,并且爬取每个企业的基本信息,资质证书和注册人员信息。
首先分析目标网站,要查询到每个企业的详细信息,需要获取到企业id,先写个爬虫获取企业id并导出到id表格中:
class ElistSpider(scrapy.Spider):
name = 'eList'
allowed_domains = ['http://jst.sc.gov.cn/xxgx/Enterprise/eList.aspx']
f_1Sheet1 = None
f_1_count = None
# 设置浏览器用户代理
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'}
def start_requests(self):
# 读取企业名称excel
f_1 = xlrd.open_workbook(r'企业名称.xlsx')
self.f_1Sheet1 = f_1.sheet_by_index(0)
# 表里的数据量(数据行数)
self.f_1_count = self.f_1Sheet1.nrows
# 第一次请求页面,设置开启cookie使其得到cookie,设置回调函数
return [Request('http://jst.sc.gov.cn/xxgx/Enterprise/eList.aspx', meta={'cookiejar': 1}, callback=self.parse)]
def parse(self, response):
__VIEWSTATE = response.css('#__VIEWSTATE::attr(value)').extract()[0]
__VIEWSTATEGENERATOR = response.css(
'#__VIEWSTATEGENERATOR::attr(value)').extract()[0]
__EVENTVALIDATION = response.css(
'#__EVENTVALIDATION::attr(value)').extract()[0]
# print(__VIEWSTATE)
# print(__VIEWSTATEGENERATOR)
# print(__EVENTVALIDATION)
# 设置提交表单信息,对应抓包得到字段
for i in range(1, self.f_1_count):
rows = self.f_1Sheet1.row_values(i) # 获取行内容
form_data = {
'__VIEWSTATE': __VIEWSTATE,
'__VIEWSTATEGENERATOR': __VIEWSTATEGENERATOR,
'__EVENTVALIDATION': __EVENTVALIDATION,
'qylx': '',
'mc': str(rows[0]),
'xydm': '',
'fr': '',
'zsbh': '',
'ctl00$MainContent$Button1': '搜索'
}
# 第二次用表单post请求,携带Cookie、浏览器代理等信息给Cookie授权
yield FormRequest(response.url, meta={'cookiejar': response.meta['cookiejar']}, headers=self.header, formdata=form_data, callback=self.next, dont_filter=True)
def next(self, response):
items = ElistItem()
name_id = response.css('.search-result tr td a::attr(href)')
if name_id:
items['name_id'] = name_id.extract()[0]
yield items
从企业名单表中读取企业名称,事先抓包一下请求地址和字段,模拟表单提交,爬取企业id。需要注意的是,网站是用asp.net框架开发的,表单提交的一些字段需要从页面获取:
有了企业id,就可以为所欲为了~接下来写个爬虫,爬取企业的基本信息:
class EzsxxSpider(scrapy.Spider):
name = 'eZsxx'
f_1Sheet1 = None
f_1_count = None
url = []
# 设置浏览器用户代理
header = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:54.0) Gecko/20100101 Firefox/54.0'}
def start_requests(self):
# 读取企业id