程序中用到的一些零碎知识点:
一、列表推导式:帮助我们快速生成一堆数据的列表
1、format:字符串格式化的一种方式
>>> ["10月{}日".format(i) for i in range(1,10)]
['10月1日', '10月2日', '10月3日', '10月4日', '10月5日', '10月6日', '10月7日', '10月8日', '10月9日']
二、字典推导式:帮助我们快速生成一堆数据的字典
>>> {i+10:i for i in range(10)}
{10: 0, 11: 1, 12: 2, 13: 3, 14: 4, 15: 5, 16: 6, 17: 7, 18: 8, 19: 9}
>>> {"a{}".format(i):10 for i in range(10)}
{'a0': 10, 'a1': 10, 'a2': 10, 'a3': 10, 'a4': 10, 'a5': 10, 'a6': 10, 'a7': 10, 'a8': 10, 'a9': 10}
三、三元运算符
a=10 if 3>4 else 20 #a=20
a=10 if 3<4 else 20 #a=10
代码如下:
import requestsfrom lxml import etreeimport jsonclass Qiushibaike():def __init__(self):self.url = "/8hr/page/{}/"self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/66.0.3359.181 Safari/537.36"}def parse_url(self,url):print("now:",url)response =requests.get(url,headers = self.headers)return response.content.decode()def get_content_list(self,html_str):html = etree.HTML(html_str)div_list = html.xpath("//div[@id='content-left']/div")content_list=[]for div in div_list:item={}item["username"]=div.xpath(".//div[@class='author clearfix']//h2/text()")[0].strip() if len(div.xpath(".//div[@class='author clearfix']//h2/text()"))>0 else Noneitem["age"]=div.xpath(".//div[@class='author clearfix']//div/text()")item["content"]=div.xpath(".//div[@class='content']/span/text()")item["stats_vote"]=div.xpath(".//span[@class='stats-vote']/i/text()")item["stats_vote"]=item["stats_vote"][0] if len(item["stats_vote"])>0 else Noneitem["stats_commments"]=div.xpath(".//span[@class='stats-comments']//i/text()")item["stats_commments"]=item["stats_commments"][0] if len(item["stats_commments"])>0 else Noneitem["img"]=div.xpath(".//div[@class='thumb']//img/@src")item["img"]="https:"+item["img"][0] if len(item["img"])>0 else Nonecontent_list.append(item)return content_listdef save_content_list(self,content_list):with open("糗事百科.txt","a",encoding="utf-8") as f:for content in content_list:f.write(json.dumps(content,ensure_ascii=False,indent=2))f.write("\n")print("保存成功")def run(self):#1.根据url地址的规律构造url_listurl_list = [self.url.format(i) for i in range(1,14)]#2.发送请求,获取响应for url in url_list:html_str = self.parse_url(url)#3.提取数据content_list = self.get_content_list(html_str)#4.保存self.save_content_list(content_list)if __name__ == '__main__':qiushi = Qiushibaike()qiushi.run()
如果觉得《【Python】数据提取xpath和lxml模块(糗事百科的爬虫)》对你有帮助,请点赞、收藏,并留下你的观点哦!