目的
爬取http://seputu.com/数据并存储csv文件
导入库
lxml用于解析解析网页HTML等源码,提取数据。一些参考:https://www.cnblogs.com/zhangxinqi/p/9210211.html
requests请求网页
chardet用于判断网页中的字符编码格式
csv用于存储文本使用。
re用于正则表达式
from lxml import etree import requests import chardet import csv import re
获取网页
生成网页头带入到request.get中,可以模拟浏览器。其中的网页头,可以在浏览器控制台,network下查找到。
user_agent='Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0' headers={'User-Agent':user_agent} r=requests.get('http://seputu.com/',headers=headers)
判断并转换编码
r.encoding=chardet.detect(r.content)['encoding']
解析网页
html=etree.HTML(r.text)
提取网页信息
浏览器打开对应网站,找到要提取的标签,通过元素审查,完成html文本内容的抽取。
这里抽取的内容为h2_title,href,title内容。title通过正则表达式完成分组,并进行数据提取。
注意的是:python正则表达式部分,不支持部分的零宽断言语法,采用分组方案,避开了可能出现的错误!
如以下代码会出错:
import re box_title='[2012-5-23 21:14:42] 盗墓笔记 贺岁篇 真相' pattern=re.compile(r'(?<=[.*]s).*') result1=re.search(pattern, box_title)
rows存储了二维数据,用于写入csv文件。
div_mulus=html.xpath('.//*[@class="mulu"]') rows=[] for div_mulu in div_mulus: div_h2=div_mulu.xpath('./div[@class="mulu-title"]/center/h2/text()') if len(div_h2)>0: h2_title=div_h2[0] a_s=div_mulu.xpath('./div[@class="box"]/ul/li/a') for a in a_s: href=a.xpath('./@href')[0] box_title=a.xpath('./@title')[0] pattern=re.compile(r's*[(.*)]s+(.*)') result1=re.search(pattern, box_title) rows.append([h2_title,result1.group(2),href,result1.group(1)]) pass pass pass
存储数据
建立header一维数据,配合之前rows二维数据,通过w权限,配合writer方法,完成一维、二维的数据写入
通过最后的输出,标记正常完成。
headers=['title','real_title','href','date'] with open('text.csv','w') as f: f_csv=csv.writer(f,) f_csv.writerow(headers) f_csv.writerows(rows) print('finished')