likes
comments
collection
share

小白学python(爬虫写着玩系列1)

作者站长头像
站长
· 阅读数 11

最近周末没啥事情,跟着bilbil大学里面的视频跟着敲,从爬虫到数据处理再到数据可视化,感觉把python前端的知识大概了解下吧(大佬勿喷)。现在头大不行,一堆东西都只是浅尝辄止,感觉这样不太行,毕竟欲速则不达嘛。所以我现在先从我感兴趣的爬虫开始,找几个简单的网站爬一爬,随便玩玩同时加强知识的记忆与运用,把可能出现的问题都解决下,知识落到实地才是最重要的。我也会把代码和注释与注意标清楚(感觉都是给我自己看的啦),同时也谢谢大家能批评指正。

爬豆瓣电影排行榜

网址 豆瓣电影排行榜 这个和我之前学的很像,所以先从这开始吧。

爬出第一个信息 电影链接

注释很清楚了,就不过多解释了。

from bs4 import BeautifulSoup     #网页解析,获取数据
import re       #正则表达式,进行文字匹配
import urllib.request,urllib.error      #制定URL,获取网页数据
import xlwt     #进行excel操作
import sqlite3  #进行SQLite数据库操作
def main():
    baseurl = "https://movie.douban.com/chart"
    print(GETDATA(baseurl))

findlink = re.compile(r'<a class="" href="(.*?)">')

def GETDATA(baseurl):
    datalist = []
    #此处的html是为解析的
    html = GETURL(baseurl)
    #用beautifulsoup进行树形解析
    soup = BeautifulSoup(html,"html.parser")
    for item in soup.find_all('tr',class_='item'):  #这里根据你查看网页源码来确定范围
        data = []
        item = str(item) #此处一定要变字符串,不然re会报错
        #print(item)
        link =  re.findall(findlink,item)   #建立规则用你打印出来的来创建,用网页的可能会出错
        data.append(link)
        datalist.append(data)       #注意此处在for循环里面,不然会报变量未定义的错
    return datalist

def GETURL(url):
    #1.伪装
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"}
    #请求
    request = urllib.request.Request(url,headers=header)
    #回应
    response=urllib.request.urlopen(request)
    #用utf-8读出来
    html = response.read().decode("utf-8")
    #完事返回
    return html

if __name__ == "__main__":
    main()

小白学python(爬虫写着玩系列1) 这里说下正则,正则默认为贪婪模式(尽可能匹配最多字符),所以.为匹配任意多字符,.?为匹配尽可能少字符(但在这其实都一样)

就一部分爬的网页来举例:

<tr class="item">
<td valign="top" width="100">
<a class="nbg" href="https://movie.douban.com/subject/35076714/" title="扎克·施奈德版正义联盟">
<img alt="扎克·施奈德版正义联盟" class="" src="https://img9.doubanio.com/view/photo/s_ratio_poster/public/p2634360594.jpg" width="75"/>
</a>
</td>
<td valign="top">
<div class="pl2">
<a class="" href="https://movie.douban.com/subject/35076714/">
                        扎克·施奈德版正义联盟
                        / <span style="font-size:13px;">查克·史奈德之正义联盟(台) / 正义联盟导演剪辑版</span>
</a>
<p class="pl">2021-03-18(美国) / 本·阿弗莱克 / 亨利·卡维尔 / 盖尔·加朵 / 杰森·莫玛 / 埃兹拉·米勒 / 雷·费舍尔 / 艾米·亚当斯 / 威廉·达福 / 杰西·艾森伯格 / 杰瑞米·艾恩斯 / 戴安·琳恩 / 康妮·尼尔森 / J·K·西蒙斯 / 塞伦·希德 / 郑恺 / 艾梅柏·希尔德...</p>
<div class="star clearfix">
<span class="allstar45"></span>
<span class="rating_nums">8.9</span>
<span class="pl">(150044人评价)</span>
</div>
</div>
</td>
</tr>
<tr class="item">
<td valign="top" width="100">
<a class="nbg" href="https://movie.douban.com/subject/30456637/" title="沿路而下">
<img alt="沿路而下" class="" src="https://img1.doubanio.com/view/photo/s_ratio_poster/public/p2633150167.jpg" width="75"/>
</a>
</td>
<td valign="top">
<div class="pl2">
<a class="" href="https://movie.douban.com/subject/30456637/">
                        沿路而下
                        / <span style="font-size:13px;">90分钟惊涛械劫(港) / 马德里金库盗数90分钟(台)</span>
</a>
<p class="pl">2021-01-15(中国台湾) / 2021-11-12(西班牙) / 弗莱迪·海默 / 阿斯特丽德·伯格斯-弗瑞斯贝 / 利亚姆·坎宁安 / 萨姆·赖利 / 法米克·詹森 / 路易斯·托萨尔 / 何塞·科罗纳多 / 阿克塞尔·施泰因 / 埃米利奥·古铁雷斯·卡巴 / 亨特·特里梅恩...</p>
<div class="star clearfix">
<span class="allstar35"></span>
<span class="rating_nums">7.0</span>
<span class="pl">(6103人评价)</span>
</div>
</div>
</td>
</tr>

这里有两个电影的资料,可以看出一个电影资料从 < tr class="item"> 到< /tr>,就可以此为循环搜索; < a class="" href="movie.douban.com/subject/350… 其实大部分文字匹配用.或.?就完事了。 我要是匹配间断时间如 2002-1-8,就写为(\d*)-(\d*)-(\d*)就行了。

from bs4 import BeautifulSoup     #网页解析,获取数据
import re       #正则表达式,进行文字匹配
import urllib.request,urllib.error      #制定URL,获取网页数据
import xlwt     #进行excel操作
import sqlite3  #进行SQLite数据库操作
def main():
    baseurl = "https://movie.douban.com/chart"
    result = GETDATA(baseurl)
    savepath = "movie_text.xls"
    cnt = 0
    # for i in range(0,10):
    #    data = result[i]
    #    for j in range(0,4):
    #         print(data[j])
    #         print(type(data[j]))

    # for i in range(0,3):
    #     result[2][i].append(text)
    # print(text)
    # for i in result[2][2]:
    #     tt=list(i)
    #     print(tt)
    #     print(type(tt))

    SAVE(savepath,result)
    print("OK")

findlink = re.compile(r'<a class="" href="(.*?)">')
findname = re.compile(r'title="(.*)">')
findtime = re.compile(r'<p class="pl">(\d*)-(.\d*)-(\d*)')
findactor = re.compile(r'/ (.*?)...</p>')

def GETDATA(baseurl):
    datalist = []
    #此处的html是为解析的
    html = GETURL(baseurl)
    #用beautifulsoup进行树形解析
    soup = BeautifulSoup(html,"html.parser")

    for item in soup.find_all('tr',class_='item'):  #这里根据你查看网页源码来确定范围
        data = []
        item = str(item) #此处一定要变字符串,不然re会报错
        #print(item)
        #链接
        link =  re.findall(findlink,item) #建立规则用你打印出来的来创建,用网页的可能会出错
        data.append(link)
        #电影名
        name = re.findall(findname,item)
        data.append(name)
        #上映时间
        time = re.findall(findtime, item)#这里要哭了,这里匹配完成为tuple,不能写入,还得变成list才行
        res = ['-'.join(i) for i in time]
        data.append(res)
        #演员表
        actor = re.findall(findactor,item)
        data.append(actor)
        datalist.append(data)       #注意此处在for循环里面,不然会报变量未定义的错
    return datalist

def SAVE(savepath,datalist):
    #以utf-8创建excel对象book
    book = xlwt.Workbook(encoding="utf-8",style_compression=0)
    #创建一个sheet表
    sheet  =book.add_sheet('douban250',cell_overwrite_ok=True)
    col = ["影片豆瓣链接",'名称','上映时间','演员']
    for i in range(0,4):
        sheet.write(0,i,col[i])
    for i in range(0,10):
        print("%d条" % i)
        data = datalist[i]
        for j in range(0,4):

            sheet.write(i+1,j,data[j])
    book.save(savepath)

def GETURL(url):
    #1.伪装
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3861.400 QQBrowser/10.7.4313.400"}
    #请求
    request = urllib.request.Request(url,headers=header)
    #回应
    response=urllib.request.urlopen(request)
    #用utf-8读出来
    html = response.read().decode("utf-8")
    #完事返回
    return html

if __name__ == "__main__":
    main()

小白学python(爬虫写着玩系列1) 写完这个真的是对爬数据有了很深的理解。。下一步爬爬图片啥的。

转载自:https://juejin.cn/post/6989187381047853070
评论
请登录