实例目标:
在政府招标采购网上,爬取招标信息,并写入CSV文件,形成招标结果信息表格。
政府招标采购网址:
链接: linkhttp://www.ccgp-hubei.gov.cn/notice/cggg/pzhbgg/index_1.html.
页面如下:
每一条项目信息都是一个链接,进入链接后,是项目的完整信息:
最终目标是获取每个项目的具体信息,如项目编号、项目名称、中标金额等,并形成表格。
步骤
1. 爬虫过程中要针对主页和每个项目链接,分别实现html获取,并解析,所以分别将这两块写成函数:
def download_page()
def xml_aly
2. 获取分页信息,设置翻页循环次数
page_end=xml_aly(rule=rule_host,url=u_host)
end_num=re.findall("\d+",page_end[0]) #获取招标首页页码信息
page=end_num[1]
n=int(page)
3. 创建csv文件,并写入表头
with open('zb.csv','a',newline='') as f:
writer = csv.writer(f)
writer.writerow(['项目编号','项目名称','供应商','项目金额','日期']) #写入表头
4. 分别爬取每个项目信息,并写入csv
代码
重要环节已在代码中注释
import random
import requests
from lxml import etree
import re
import csv
#获取页面html
def download_page(url, user_Agent=None, referer=None):
#应对反爬虫,构建User_Agent池
ua_list=[
"Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:87.0) Gecko/20100101 Firefox/87.0"
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3314.0 Safari/537.36 SE 2.X MetaSr 1.0",
]
user_Agent=random.choice(ua_list)
headers = {
"Referer":referer,
"User-Agent":user_Agent
}
response = requests.get(url=url,headers=headers)
try:
html = response.content.decode("utf-8")
except Exception as e:
print("Download error:",e)
html = None
return html
#html解析
def xml_aly(rule,url):
html=download_page(url)
tree=etree.HTML(html)
aly_res=tree.xpath(rule)
return aly_res
if __name__ == '__main__':
u_host = "http://www.ccgp-hubei.gov.cn/notice/cggg/pzhbgg/index_1.html"
rule_host='//ul[@class="pagination"]/li[last()]/text()'
page_end=xml_aly(rule=rule_host,url=u_host)
end_num=re.findall("\d+",page_end[0]) #获取招标首页页码信息
page=end_num[1]
n=int(page)
with open('zb.csv','a',newline='') as f:
writer = csv.writer(f)
writer.writerow(['项目编号','项目名称','供应商','项目金额','日期']) #写入表头
#翻页获取所有招标项目链接
for i in range(n+1):
u_host = "http://www.ccgp-hubei.gov.cn/notice/cggg/pzhbgg/index_"+str(i)+".html"
rule_host='//ul[@class="news-list-content list-unstyled margin-top-20"]/li/a/@href'
project_link=xml_aly(rule=rule_host,url=u_host)
#爬取每页中所有项目链接的html,并写入csv
for link in project_link:
url_head="http://www.ccgp-hubei.gov.cn"
url=url_head+link
rule_project='//p/span/text()'
project_content=xml_aly(rule=rule_project,url=url)
project_num=project_content[0]
project_name=project_content[2]
project_sup=project_content[4]
project_scale=project_content[8]+"万元"
project_date=project_content[12]
writer.writerow([project_num,project_name,project_sup,project_scale,project_date])