爬取豆瓣图书网站的图书信息,并生成xlsx文档

这段代码是一个用来爬取豆瓣图书信息的脚本。

脚本首先定义了两个函数:get_url 和 get_data,分别用于获取分页网址和采集数据。

然后在 if __name__ == "__main__": 部分,脚本通过调用这两个函数来爬取数据。首先调用 get_url 函数获取了10个分页网址,然后使用 get_data 函数依次采集每个分页的数据。最后将采集到的数据存入 pandas 的 DataFrame,并将其保存为Excel文件。

需要注意的是,代码中使用了 requests 和 BeautifulSoup 这两个库来进行网页请求和HTML解析。此外,脚本中还设置了请求头信息和cookies信息,以模拟正常的浏览器请求。

代码可以分为以下几个部分进行分块分析:

  1. 导入库
import requests
from bs4 import BeautifulSoup
import pandas as pd

在这一部分中,导入了需要使用的库 requestsBeautifulSoup 和 pandas

  1. get_url 函数
def get_url(n):
    lst = []
    for i in range(10):
        ui = "https://book.douban.com/tag/%E7%94%B5%E5%BD%B1?start={}&type=T".format(i * 20)
        lst.append(ui)
    return lst

这个函数用于生成分页网址列表。它接收一个参数 n,表示需要生成的分页数量。通过循环,根据每个分页的编号生成相应的网址,然后将这些网址添加到 lst 列表中,并最后返回该列表。

  1. get_data 函数
def get_data(ui, d_h, d_c):
    ri = requests.get(ui, headers=d_h, cookies=d_c)
    soup_i = BeautifulSoup(ri.text, 'lxml')
    ul = soup_i.find('ul', class_='subject-list')
    lis = ul.find_all('li')

    lst = []
    for li in lis:
        # 解析每个li元素中的数据,并将其存储为一个字典
        dic = {}
        dic['标题'] = li.find("div", class_='info').h2.text.replace(" ", "").replace("\n", "")
        dic['评价'] = li.find("div", class_='star clearfix').text.replace(" ", "").replace("\n", "")
        try:
            dic['简介'] = li.find("p").text.replace("\n", ",")
        except:
            continue
        dic['其他'] = li.find("div", class_="pub").text.replace(" ", "").replace("\n", "")
        lst.append(dic)
    return lst

扫描二维码关注公众号,回复: 17185685 查看本文章

这个函数用于爬取每个分页的数据。它接收三个参数:ui 表示分页网址,d_h 表示请求头信息,d_c 表示cookies信息。

函数首先通过 requests.get 方法发送GET请求获取网页的HTML内容,并使用 BeautifulSoup 进行解析。然后根据HTML结构,使用 find 和 find_all 方法找到相应的元素,并从中提取数据。将每条数据存储为一个字典,最后将所有字典添加到一个列表中,并返回该列表。

  1. 主程序部分
if __name__ == "__main__":
    urllst_1 = get_url(10)
    u1 = urllst_1[0]

    dic_heders = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
    }

    dic_cookies = {}
    cookies = '...' # 这里省略了具体的cookies信息

    datalst = []
    errorlst = []
    for u in urllst_1:
        try:
            datalst.extend(get_data(u, dic_heders, dic_cookies))
            print("成功采集{}条数据".format(len(datalst)))
        except:
            errorlst.append(u)
            print("数据采集失败,网址是", u)

    df = pd.DataFrame(datalst)
    df = df[df['评价'].str[0] != '(']
    df['评分'] = df['评价'].str.split("(").str[0].astype("float")
    df['评价人数'] = df['评价'].str.split("(").str[1].str.split("人").str[0].astype('int')
    del df['评价']
    df['价格'] = df['其他'].str.split('/').str[-1]
    df.to_excel("图书数据爬取.xlsx", index=False)

在主程序部分,首先调用 get_url 函数生成分页网址列表。然后定义了请求头信息 dic_headers 和 cookies信息 dic_cookies。接着初始化一个空列表 datalst 用于存储所有的数据,以及一个空列表 errorlst 用于存储采集失败的网址。

通过循环遍历所有的分页网址,调用 get_data 函数爬取每个分页的数据,并将结果添加到 datalst 列表中。同时打印出采集成功的数量,并在采集失败时将失败的网址添加到 errorlst 列表中。

最后,将 datalst 列表转换为 pandas 的 DataFrame,进行数据处理和清洗。并将处理后的结果保存为Excel文件。

需要注意的是,代码中的 cookies 是被省略的,你需要提供具体的cookies信息才可以正确运行该脚本。另外,还需要根据需要适当修改保存结果的文件名和路径。

如果有任何进一步的问题,请随时告诉我。

 完整代码:

import requests
from bs4 import BeautifulSoup
import pandas as pd


def get_url(n):
    '''
    【分页网址url采集】函数
    n:页数参数
    结果:得到一个分页网页的list
    '''
    lst = []
    for i in range(10):
        ui = "https://book.douban.com/tag/%E7%94%B5%E5%BD%B1?start={}&type=T".format(i * 20)
        # print(ui)
        lst.append(ui)
    return lst


def get_data(ui, d_h, d_c):
    '''
    【数据采集】
    ui:数据信息网页
    d_h:user-agent信息
    d_c:cookies信息
    结果:得到数据的list,每条数据用dict存储
    '''
    ri = requests.get(ui, headers=d_h, cookies=d_c)
    soup_i = BeautifulSoup(ri.text, 'lxml')
    ul = soup_i.find('ul', class_='subject-list')
    lis = ul.find_all('li')

    lst = []
    for li in lis:

        dic = {}
        dic['标题'] = li.find("div", class_='info').h2.text.replace(" ", "").replace("\n", "")
        # dic['评分'] = li.find("span", class_ = 'rating_nums').text.replace("(","")
        # dic['评价人数'] = li.find("span", class_ = 'pl').text.replace(" ","").replace("\n","").replace("(","").replace(")","")
        dic['评价'] = li.find("div", class_='star clearfix').text.replace(" ", "").replace("\n", "")
        try:
            dic['简介'] = li.find("p").text.replace("\n", ",")
        except:
            continue
        dic['其他'] = li.find("div", class_="pub").text.replace(" ", "").replace("\n", "")
        lst.append(dic)
    return lst


if __name__ == "__main__":
    urllst_1 = get_url(10)
    u1 = urllst_1[0]
    # print(u1)

    dic_heders = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36'
    }

    dic_cookies = {}
    cookies = 'll="108296"; bid=b9z-Z1JF8wQ; _vwo_uuid_v2=DDF408830197B90007427EFEAB67DF985|b500ed9e7e3b5f6efec01c709b7000c3; douban-fav-remind=1; __yadk_uid=2D7qqvQghjfgVOD0jdPUlybUNa2MBZbz; gr_user_id=5943e535-83de-4105-b840-65b7a0cc92e1; dbcl2="150296873:VHh1cXhumGU"; push_noty_num=0; push_doumail_num=0; __utmv=30149280.15029; __gads=ID=dcc053bfe97d2b3c:T=1579101910:S=ALNI_Ma5JEn6w7PLu-iTttZOFRZbG4sHCw; ct=y; Hm_lvt_cfafef0aa0076ffb1a7838fd772f844d=1579102240; __utmz=81379588.1579138975.5.5.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmz=30149280.1579162528.9.8.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; ck=csBn; _pk_ref.100001.3ac3=%5B%22%22%2C%22%22%2C1581081161%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DNq2xYeTOYsYNs1a4LeFRmxqwD_0zDOBN253fDrX-5wRdwrQqUpYGFSmifESD4TLN%26wd%3D%26eqid%3De7868ab7001090b7000000035e1fbf95%22%5D; _pk_ses.100001.3ac3=*; __utma=30149280.195590675.1570957615.1581050101.1581081161.16; __utmc=30149280; __utma=81379588.834351582.1571800818.1581050101.1581081161.12; __utmc=81379588; ap_v=0,6.0; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03=b6a046c7-15eb-4e77-bc26-3a7af29e68b1; gr_cs1_b6a046c7-15eb-4e77-bc26-3a7af29e68b1=user_id%3A1; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03_b6a046c7-15eb-4e77-bc26-3a7af29e68b1=true; _pk_id.100001.3ac3=6ec264aefc5132a2.1571800818.12.1581082472.1581050101.; __utmb=30149280.7.10.1581081161; __utmb=81379588.7.10.1581081161'
    cookies_lst = cookies.split("; ")
    for i in cookies_lst:
        dic_cookies[i.split("=")[0]] = i.split("=")[1]

    datalst = []
    errorlst = []
    for u in urllst_1:
        try:
            datalst.extend(get_data(u, dic_heders, dic_cookies))
            print("成功采集{}条数据".format(len(datalst)))
        except:
            errorlst.append(u)
            print("数据采集失败,网址是", u)

    df = pd.DataFrame(datalst)
    df = df[df['评价'].str[0] != '(']
    df['评分'] = df['评价'].str.split("(").str[0].astype("float")
    df['评价人数'] = df['评价'].str.split("(").str[1].str.split("人").str[0].astype('int')
    del df['评价']
    df['价格'] = df['其他'].str.split('/').str[-1]
    df.to_excel("图书数据爬取.xlsx", index=False)

猜你喜欢

转载自blog.csdn.net/weixin_66547608/article/details/134126553