这段代码是一个用来爬取豆瓣图书信息的脚本。
脚本首先定义了两个函数:get_url
和 get_data
,分别用于获取分页网址和采集数据。
然后在 if __name__ == "__main__":
部分,脚本通过调用这两个函数来爬取数据。首先调用 get_url
函数获取了10个分页网址,然后使用 get_data
函数依次采集每个分页的数据。最后将采集到的数据存入 pandas
的 DataFrame
,并将其保存为Excel文件。
需要注意的是,代码中使用了 requests
和 BeautifulSoup
这两个库来进行网页请求和HTML解析。此外,脚本中还设置了请求头信息和cookies信息,以模拟正常的浏览器请求。
代码可以分为以下几个部分进行分块分析:
- 导入库
import requests
from bs4 import BeautifulSoup
import pandas as pd
在这一部分中,导入了需要使用的库 requests
、BeautifulSoup
和 pandas
。
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
列表中,并最后返回该列表。
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
这个函数用于爬取每个分页的数据。它接收三个参数:ui
表示分页网址,d_h
表示请求头信息,d_c
表示cookies信息。
函数首先通过 requests.get
方法发送GET请求获取网页的HTML内容,并使用 BeautifulSoup
进行解析。然后根据HTML结构,使用 find
和 find_all
方法找到相应的元素,并从中提取数据。将每条数据存储为一个字典,最后将所有字典添加到一个列表中,并返回该列表。
- 主程序部分
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)