爬什么
把百思不得姐网站的所有段子爬取下来,并保存到本地。本来是要爬内涵段子的,可惜访问不到这个网站了。
怎么做
爬虫基本思路:
获取url序列
首先进入网站,寻找url的规律。最后发现每一页内容对应的url都是有规律的:(现在找到了url规律,可获取url序列)
1 2 3 4 5 6
| 第1页:http://www.budejie.com/1 第2页:http://www.budejie.com/2 第3页:http://www.budejie.com/3 …… 第50页:http://www.budejie.com/50 总共就50页内容
|
提取数据
寻找目标数据,发现目标数据在响应的html内容里面,所在位置存在规律。于是使用xpath提取数据,这种方式最简单。
保存数据
用追加的方式写入数据。
with open("duanzi.txt","a",encoding="utf8") as f:
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| import requests from lxml import etree from pprint import pprint
class duanzi: def __init__(self): self.url_temp = "http://www.budejie.com/{}" self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
def get_url_list(self,url_temp): url_list = [] for i in range(50): url_list.append(self.url_temp.format(i+1)) return url_list
def parse_url(self,url,headers): response = requests.get(url,headers=self.headers) return response.content.decode()
def get_content(self,html_str): html_element = etree.HTML(html_str) content_list = html_element.xpath("//div[@class='j-r-list-c-desc']/a/text()") return content_list
def run(self): url_list = self.get_url_list(self.url_temp) for url in url_list: html_str = self.parse_url(url,headers=self.headers) content_list = self.get_content(html_str) with open("duanzi.txt","a",encoding="utf8") as f: f.write(str(content_list))
if __name__ == '__main__': my_duanzi = duanzi() my_duanzi.run()
|
总结
这是本人第一次独立使用面向对象的方法搞出的代码,还是开心滴~
本来打算把获取的列表构造成字典,然后用json.dumps的方式写入文件保存(这样就可以使抓取结果显示得更美观)。但是现在段位太低,还不知道怎么做。
优化
找到方法格式化保存了,没错,就是使用json.dumps这个方法。不需要把获取的列表转换为字典~因为json.dumps的作用就是可以把python数据类型转换为字符串类型,列表就是一种python数据类型,可以直接使用json.dumps
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| import requests from lxml import etree from pprint import pprint import json
class duanzi: def __init__(self): self.url_temp = "http://www.budejie.com/{}" self.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.130 Safari/537.36"}
def get_url_list(self,url_temp): url_list = [] for i in range(50): url_list.append(self.url_temp.format(i+1)) return url_list
def parse_url(self,url,headers): response = requests.get(url,headers=self.headers) return response.content.decode()
def get_content(self,html_str): html_element = etree.HTML(html_str) content_list = html_element.xpath("//div[@class='j-r-list-c-desc']/a/text()") return content_list
def run(self): url_list = self.get_url_list(self.url_temp) for url in url_list: html_str = self.parse_url(url,headers=self.headers) content_list = self.get_content(html_str) with open("duanzi.txt","a",encoding="utf8") as f: for content in content_list: f.write(json.dumps(content,ensure_ascii=False,indent=2)) f.write("\n")
if __name__ == '__main__': my_duanzi = duanzi() my_duanzi.run()
|