时隔一年重新温习python爬虫代码
一年前跟着视频敲过一次代码,但囫囵吞枣。
这次刚敲完一遍linux基础命令(不过都忘了。。。),敲过一遍html5的标签命令和部分css3的属性语法。
果真对爬虫代码的理解有所帮助。
理解代码的实现思路很关键,全文可复制,需要修改两个地方,dic_h和dic_cook,这个自行登录豆瓣网站之后,去network–doc–刷新后取User-Agent和cookies对应的值,替代就行。
"""
需求:任意图书类别的书籍信息数据采集
实现方法:
第一步,数据采集
1、摸清楚网页地址特征,获取分页网址
2、加载网页的header和cookies信息,设置登录信息
3、对每个url网页采集信息
第二步:数据清洗
1、简单的空格、换行可以直接在爬取数据时清理
2、其他的规整数据,尽量在pandas读取后再进行单独的处理
"""
import requests
from bs4 import BeautifulSoup
import pandas as pd
def get_url(n):
""":param
获取分页网址,
n,网页个数
"""
u0 = 'https://book.douban.com/tag/%E5%93%B2%E5%AD%A6?start={}&type=T'
lst = []
for i in range(n):
ui = u0.format(i*20)
lst.append(ui)
return lst
def get_dataurls(url,dic_h,dic_c):
'''
获取ul中的链接网址
url,网址
dic_h,dic_c,设置登录信息
'''
ri = requests.get(url=url, headers=dic_h, cookies=dic_c)
soupi = BeautifulSoup(ri.text, 'lxml')
# print(soupi.a)
ua = soupi.find_all('a', class_="nbg")
alst = []
for at in ua:
# print(at['href'])
alst.append(at['href'])
return alst
def get_data(url,dic_h,dic_c):
''':param
'''
ri = requests.get(url,headers=dic_h,cookies=dic_c)
soup = BeautifulSoup(ri.text,'lxml')
dic = {}
# 简单的部分
dic['书名'] = soup.find('div',id="wrapper").h1.text.replace('\n','')
dic['评分'] = soup.find('div',id="interest_sectl").strong.text.replace(' ','')
dic['评价人数'] = soup.find('div',class_="rating_sum").span.text.replace('\n','')
# 复杂部分,数据不规范的部分,先将全部text内容采集一下来。然后处理
infos = soup.find('div',id="info").text.replace(' ','').split('\n')
for info in infos:
if ':' in info:
dic[info.split(':')[0]] = info.split(':')[1]
else:
continue
#print(dic)
return dic
if __name__ == '__main__':
# s1,获取分页网址
urllsts = get_url(1)
# s2,获取链接网址
dic_h = {'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.75 Safari/537.36'}
dic_cook = {}
cookies = """
bid=Qe-_S7ADW18; gr_user_id=2916a697-0a2e-4987-97b1-76150dc7b42d; __yadk_uid=80P70BG62dBAceZw7g56Re00TtBp7oSe; _vwo_uuid_v2=D379786C4346C7593A52E9DE4CE54E713|9516145193960e9cbf523d191c0020d4; ll="118159"; __utmv=30149280.13067; douban-fav-remind=1; __utmz=81379588.160110__utmz=30149280.1601963070.45.35.utmcsr=baidu|utmccn=(organic)|utmcmd=organic; __utmc=30149280; __utma=81379588.1474574412.1575552692.1601102194.1602804090.11; __utmc=81379588; viewed="35125822_269182%22%2C1602908748%2C%22https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D41lDUtnrKfebMrWmvAlNxWB6F15LZp2kDoncYiKnSWFbw4p4JfOCIoeEBn3bMobk%26wd%3D%26eqid%3Da2e3e7e500000c99000000045f8a7248%22%5D; _pk_ses.100001.3ac3=*; gr_session_id_22c937bbd8ebd703f2d8e9445f7dfd03_d8156dbc-e8ff-42d5-9f10-620320bd8a3a=true; _pk_id.100001.3ac3=c33f5b6a97d8fc48.1575552691.14.1602909087.1602896585.
"""
for i in cookies.split('; '):
dic_cook[i.strip().split('=')[0]] = i.strip().split('=')[1]
#print(dic_cook)
dataurl_lst = []
for url in urllsts:
# 异常处理办法,保证程序先执行
try:
dataurls = get_dataurls(url,dic_h,dic_cook)
dataurl_lst.extend(dataurls)
#print('成功采集页面地址,采集成功%d条' % (len(dataurl_lst)))
except:
print('采集失败,失败地址为%s' % url)
#print(len(dataurl_lst))
#print(dataurl_lst[0])
# s3,获取链接网页的数据信息
import time
import random
datalsts = []
errurls = []
for url in dataurl_lst:
# 设置间隔时间
time.sleep(random.randint(1, 3))
# 异常处理办法,保证程序先执行
try:
datalst = get_data(url,dic_h,dic_cook)
datalsts.append(datalst)
print('链接网址数据采集成功,采集成功%i条' % len(datalsts))
except:
errurls.append(url)
print('链接网址数据采集失败,采集地址为%i' % url)
df = pd.DataFrame(datalsts)
df['评分'] = df['评分'].astype('float')
df['评价人数'] = df['评价人数'].str.split('人').str[0].astype('int')
# ri = requests.get(dataurl_lst[0],headers=dic_h,cookies=dic_cook)
# soup = BeautifulSoup(ri.text,'lxml')
# infos = soup.find('div',id="info").text.split('\n')
# print(infos)
```python
代码段截图。
之后尝试爬取下其他网站数据。。