e分钟带你用Python爬取海量数据

    科技2022-07-11  100

    大家好,我是天空之城。在我们的日常工作和生活中,总是会碰到需要采集大量数据的情况,这些数据都有固定的格式,例如一份专利文件就会有多个字段,如申请日,申请人,发明人,公开日,分类号,摘要和权利要求书等等。那么如果我们现在需要在极短时间内获取上百、上千、甚至上万份这些专利的上述信息该怎么办呢?常规的方法就是先检索出来再逐条复制粘贴,然后通过格式转换软件把上述信息转成excel文件,方便我们进行下一步的数据处理!

    但是Python就为我们提供了另一种解决问题的思路,我们可以通过写一个Python爬虫程序,直接将上述信息保存为excel文件,一步到位,让子弹不再飞!

    网页保存和展示信息也是具有一定规律性的,下面以豆瓣电影信息的获取作为例子(https://movie.douban.com/top250?start=1&filter=)!如图1是我们能够直接在网页上看到的信息,每一部电影都包括以下字段:电影名称、导演、主演、影片上映时间、影片类型、影片简介等! 图1

    那么网页的源代码又是如何存放这些电影信息的呢?图2是网页源代码截图,每一部电影信息就存放在一个li标签里面!所有的li标签存放在一个大列表里面!简而言之,就是用一个大列表把这些数据都装进去了,这样每一部电影就是列表里面的一个元素!参见图2,就会一目了然!

    图2

    而我们用Python程序爬取信息的思路就是先获取所有li标签下的内容,这样就会得到一个包含所有电影信息的大列表,再通过for循环遍历这个列表,逐个获取每一部的电影的所有字段信息! 图3

    从图3可以发现,电影序号位于<em>标签中, 电影名称位于<span class=”title”>标签中, 评分位于<span class=”rating_num”>标签中, 电影评论位于<span class=”inq”>标签中, 电影网址位于<a>标签中。 至此,我们找到了所有我们想要的数据地址。

    图4 从图4可以发现,该电影信息一共有10页,每一页是25条数据,一共250条数据。我们可以研究一下,每一页网址的规律: 第一页网址是https://movie.douban.com/top250?start=1&filter= 第二页网址是https://movie.douban.com/top250?start=25&filter= 第三页网址是https://movie.douban.com/top250?start=50&filter= ··· 第十页网址是https://movie.douban.com/top250?start=225&filter=

    相信聪明的你,已经发现网址的规律了,就是start参数后面的数字不断在以25的倍数递增(0,25,50···,225,第一页start后面数字改成0同样可以显示第一页)。那么我们就可以利用这个规律,获取这10页所有的数据信息了(如果是100页,同样符合这个规律)!接下来就可以开始书写我们的爬虫程序了!

    #导入网络请求模块 import requests #导入网页解析模块 from bs4 import BeautifulSoup #书写请求头 header = { 'Referer': 'https://movie.douban.com/top250?start=1&filter=', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:46.0) Gecko/20100101 Firefox/46.0'} #构建for循环,i就是start参数后面不断递增的数字(0,25,50···,225) for i in range(0,225,25): res = requests.get(headers=header,url='https://movie.douban.com/top250?start={}&filter='.format(str(i))) film = res.text #这里的res.text就是获取到的整个网页的所有源代码了,下面利用 'html.parser'模块进行网页数据的解析 soup = BeautifulSoup(film, 'html.parser') #首先获取到了所有li标签下面的<‘div’,class_="item">标签,构成一个大的列表 items = soup.find_all(“div”,class_="item") #对列表进行遍历,获取每一部电影的相关信息 for item in items: xuhao=item.find('em').text #序号 title=item.find(class_="title").text #电影名称 pingfen=item.find(class_="rating_num").text #评分 comment=item.find(class_="inq").text #评论 link=item.find('a')['href'] #网址 #打印一下我们获得的信息 print(xuhao,title,pingfen,comment,link)

    在pycharm软件中执行一下上面的代码,就会得到下图的电影信息,非常简洁高效! 图5

    那么接下来,我们就是要把这些信息都保存为excel文件了。首先需要导入openpyxl模块(Python操作excel文件的模块):

    import openpyxl #创建一个wb表格 wb = openpyxl.Workbook() #激活表格 sheet = wb.active #给表格命名为doubanfilm sheet.title = 'doubanfilm' #给表格添加表头,相当于第一行的字段名 sheet['A1'] = '序号' # 加表头,给A1单元格赋值 sheet['B1'] = '电影名' # 加表头,给B1单元格赋值 sheet['C1'] = '评分' # 加表头,给C1单元格赋值 sheet['D1'] = '评论' # 加表头,给D1单元格赋值 sheet['E1'] = '网址' # 加表头,给E1单元格赋值 然后在上面print代码后面加上以下三行代码,就可以将数据保存到excel文件中。 row = [xuhao, title, pingfen, comment,link] sheet.append(row) wb.save('doubanfilm.xlsx')

    以下保存后得到的excel文件截图。怎么样?Python是不是帮我们解决了很大的问题并且节省了大量时间呢!

    图6

    完整爬虫和保存为excel文件代码如下:

    #导入网络请求模块 import requests import openpyxl wb = openpyxl.Workbook() sheet = wb.active sheet.title = 'doubanfilm' sheet['A1'] = '序号' # 加表头,给A1单元格赋值 sheet['B1'] = '电影名' # 加表头,给B1单元格赋值 sheet['C1'] = '评分' # 加表头,给C1单元格赋值 sheet['D1'] = '评论' # 加表头,给D1单元格赋值 sheet['E1'] = '网址' # 加表头,给E1单元格赋值 #导入网页解析模块 from bs4 import BeautifulSoup #书写请求头 header = { 'Referer': 'https://movie.douban.com/top250?start=1&filter=', 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; rv:46.0) Gecko/20100101 Firefox/46.0'} #构建for循环,i就是start参数后面不断递增的数字(0,25,50···,225) for i in range(0,225,25): res = requests.get(headers=header,url='https://movie.douban.com/top250?start={}&filter='.format(str(i))) film = res.text #这里的res.text就是获取到的整个网页的所有源代码了,下面利用 'html.parser'模块进行网页数据的解析 soup = BeautifulSoup(film, 'html.parser') #首先获取到了所有li标签下面的<‘div’,class_="item">标签,构成一个大的列表 items = soup.find_all("div",class_="item") #对列表进行遍历,获取每一部电影的相关信息 for item in items: xuhao=item.find('em').text #序号 title=item.find(class_="title").text #电影名称 pingfen=item.find(class_="rating_num").text #评分 comment=item.find(class_="inq") #评论 if comment==None: comment='' else: comment = item.find(class_="inq").text # 评论 link=item.find('a')['href'] #网址 #打印一下我们获得的信息 print(xuhao,title,pingfen,comment,link) row = [xuhao, title, pingfen, comment,link] sheet.append(row) wb.save('doubanfilm.xlsx')

    那么,Python除了可以帮我们把数据直接保存为excel文件外,还可以保存为txt文本文件,另一种表格csv文件,还可以直接保存到mysql数据库中,甚至还可以直接发送到我们自己的邮箱呢!如果大家感兴趣的话,下次我再写一篇文章介绍怎么把爬虫获取到的海量数据定时定量发送我们的邮箱中!获取数据比如美味佳肴的菜单,减肥食谱,国内外新闻,流行音乐排行榜,热门电影,热门微博,热门影评,热点景区游记,专利数据等等!将获取到的数据制作词云图等,都可以依法炮制。只有你想不到,没有Python做不到的事情!好了,大家如果有需要的话,可以参考下我的博客,好玩的小程序等你来发现! (https://blog.csdn.net/littlespider889/article/details/106480523)

    Processed: 0.009, SQL: 8