python爬虫(五)

爬虫的一个具体事例讲解
import requests
from lxml import etree
import json

class QiubaiSpyder:
def init(self):
self.url_temp = "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/67.0.3396.99 Safari/537.36"}

def get_url_list(self):  # 1
    url_list = [self.url_temp.format(i) for i in range(1, 14)]
    return url_list

def parse_url(self, url):  # 2.
    print("url = ", url)
    response = requests.get(url, headers= self.headers)
    return response.content.decode()

def get_content_list(self, html_str):  # 3.
    html = etree.HTML(html_str)
    # 1.分组
    div_list = html.xpath("//div[@id='content-left']/div")
    content_list = []
    for div in div_list:
        item = {}
        # .strip()使“\n”去掉
        item["Author"]=div.xpath(".//h2/text()")[0].strip() if              len(div.xpath(".//h2/text()")) > 0 else None
        item["content"] = div.xpath(".//div[@class= 'content']/span/text()")
        item["content"] = [i.strip() for i in item["content"]]
        item["thumb"] = div.xpath(".//div[@class= 'thumb']/img/@src")
     item["states_vote"]=div.xpath(".//span[@class='statesvote']/i/text()")
        item["states_vote"]=item["states_vote"][0] if len(item["states_vote"]) > 0 else None
        item["comment_numbers"]=div.xpath(".//span[@class= 'states-comments']//i/text()")
        item["comment_numbers"] = item["comment_numbers"] if len(item["comment_numbers"]) > 0 else None
        content_list.append(item)
    return content_list

def save_content_list(self, content_list):
    with open("qiubai.txt", "a", encoding= 'utf-8') as f:
        for content in content_list:
            f.write(json.dumps(content, ensure_ascii=False))  # 转换成json字符串才能写入字典当中
            f.write("\n")
        print("保存成功")

def run(self): # 实现主要逻辑
    # 1.根据url地址规律,构造url list
    url_list = self.get_url_list()

    # 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':
qiubai = QiubaiSpyder()
qiubai.run()

这是写的一个简单的爬取糗事百科的程序,非常简单,复制粘贴即可使用,属于一个爬虫的基本框架,还可以进一步修改。

这个就是爬取的数据,以字典的形式展示出来。
一个爬虫的基本流程就是:
1.url
--知道你所要爬取的网站url地址,或url地址的规律和页数,构造url地址列表
--开始创建start_url列表
2.发送请求,获取响应
--requests发送请求,get响应
3.提取数据
--返回json,使用json模块
--返回html,lxml模块,并使用xpath提取数据
--返回其他,如图片,可以直接保存为jpg或png文件
4.保存数据
--可以按列表的形式保存为.csv文件
--或者直接保存为.txt文件
后面的3,4步可以在响应中进行,也可单独进行。
主程序为run()函数,在该函数下进行细分为四个子函数,每个子函数完成一个功能。
def get_content_list(self, html_str)函数,使用了之前讲解过的lxml模块,这个模块用于从html中提取数据。

posted @ 2019-01-22 16:10  Messie_M  阅读(265)  评论(0编辑  收藏  举报