程序中用到的一些零碎知识点:
一、列表推导式:帮助我们快速生成一堆数据的列表
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 requests
from lxml import etree
import json
class Qiushibaike():
def __init__(self):
self.url = "https://www.qiushibaike.com/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 None
item["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 None
item["stats_commments"]=div.xpath(".//span[@class='stats-comments']//i/text()")
item["stats_commments"]=item["stats_commments"][0] if len(item["stats_commments"])>0 else None
item["img"]=div.xpath(".//div[@class='thumb']//img/@src")
item["img"]="https:"+item["img"][0] if len(item["img"])>0 else None
content_list.append(item)
return content_list
def 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_list
url_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()