菜鸟温习python爬虫

时隔一年重新温习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

代码段截图
代码段截图。
之后尝试爬取下其他网站数据。。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值