鱼C论坛

 找回密码
 立即注册
查看: 2642|回复: 10

[已解决]新手爬蟲,求大佬們指點

[复制链接]
发表于 2017-4-21 19:26:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
各位大佬好,小可剛開始學習定向爬蟲,嘗試爬取豆瓣熱播電影,代碼如下:
  1. from bs4 import BeautifulSoup
  2. import requests

  3. url = requests.get('https://movie.douban.com/')
  4. demo = url.text

  5. soup = BeautifulSoup(demo,'html.parser')
  6. for link in soup.find_all('li'):
  7.     movie_name = link.get('data-title')
  8.     movie_actor = link.get('data-actors')
  9.     movie_rate = link.get('data-rate')
  10.     if movie_name != None and movie_actor!=None and movie_rate != None:
  11.         print('電影名:{:^10}\t演員:{:^6}\t評分:{:^10}'.format(movie_name,movie_actor,movie_rate))
复制代码


運行發現問題,即在返囘值中存在很多的None,這是怎麽一回事?
純自學,感覺爬蟲非常不容易,同時現存在以下問題:
1.懇請大佬們對小可爬蟲的學習指點一二,如何學習爬蟲?
2.如何能夠迅速的獲取想要的標簽内容?
最佳答案
2017-4-21 23:00:10
本帖最后由 ooxx7788 于 2017-4-22 00:48 编辑
文质彬彬胡汉三 发表于 2017-4-21 21:49
感謝大佬!我現在實用你提供的這個網址,爬取電影名字,可否請大佬提供一個實例指點一二呀
我不明白的是 ...

  1. import requests
  2. from bs4 import BeautifulSoup

  3. url = 'https://movie.douban.com/tag/%E7%88%B1%E6%83%85'
  4. r = requests.get(url).content
  5. soup = BeautifulSoup(r, 'lxml')
  6. for each in soup.find_all('table', attrs={'width': '100%', 'class': ''}):
  7.     print(each.a.get('href'))  # 对应页面链接,可以为进一步爬取详细内容做准备。
  8.     print(each.p.text)  # 播放地区、演员、时间等信息,此处分类不明确,如果需要详细分类,可以上个链接的详细分类。
  9.     print('星数:', int(each.find_all('span')[-3].attrs.get('class')[0][-2:]) / 10)
  10.     print('评价人数:', str(each.find_all('span')[-1].text).strip('()'))
  11.     print('评分:', each.find('span', attrs='rating_nums').text)
复制代码


对于绝大多数网页来说,其实Beautiful soup很好用,当然前提是要对Beautiful soup比较熟悉。不需要写上一堆让人看不懂的正则表达式。
而其实这里基本上已经把爬取豆瓣所有电影的主要代码写完了,只需要能够遍历所有标签,就可以爬取全站电影信息了。
当然我这里没有做异常处理,里面拾取的标签中,其实有部分新上映或者未上映的电影是没有评分这个标签的,这种就需要根据情况处理了。不过这里就不太多展开了。可以自己考虑考虑。
哎哟,刚刚仔细看了看,电影名字没有获取,不过这也不是重点了,算留给你自己解决的问题吧。

输出(部分显示):
  1. https://movie.douban.com/subject/25900945/
  2. 2017-03-17(中国大陆/美国) / 艾玛·沃森 / 丹·史蒂文斯 / 卢克·伊万斯 / 凯文·克莱恩 / 乔什·加德 / 伊万·麦克格雷格 / 伊恩·麦克莱恩 / 艾玛·汤普森 / 斯坦利·图齐 / 古古·姆巴塔-劳 / 奥德拉·麦克唐纳 / 内森·麦克 / 哈蒂·莫拉汉...
  3. 星数: 4.0
  4. 评价人数: 110124人评价
  5. 评分: 7.4
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-4-21 19:54:39 | 显示全部楼层
审查元素里面不是所有li的标签有这些属性,当然获取不到。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-21 20:12:34 | 显示全部楼层
ooxx7788 发表于 2017-4-21 19:54
审查元素里面不是所有li的标签有这些属性,当然获取不到。

請教大佬,如果現在只想獲取有有某元素的li標簽,應該如何實現?是否應該實用正則表達式?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-21 20:32:37 | 显示全部楼层
本帖最后由 ooxx7788 于 2017-4-21 20:34 编辑
文质彬彬胡汉三 发表于 2017-4-21 20:12
請教大佬,如果現在只想獲取有有某元素的li標簽,應該如何實現?是否應該實用正則表達式?


对于网页的选择比较重要,像你选择的这个网页,同类信息含量少,编制成爬虫的意义也比较小。
相对而言比如选择:https://movie.douban.com/tag/%E7%88%B1%E6%83%85
这种类型的网页,网页代码整齐,想要提取信息难度就比较小。
如果会正则表达式,当然不错,不用去考虑网页代码的结构,根据文字就能查找需要的内容了。但是如果提取的元素比较多,毕竟编写正则表达式也是挺麻烦的,如果考虑不周全获得的内容也就不太周全。
而对于结构比较整齐的网页,用Beautiful soup本身的方法,xpath这些现成的工具就很方便。
总之这还是要根据实际情况来确定的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-21 21:49:10 | 显示全部楼层
ooxx7788 发表于 2017-4-21 20:32
对于网页的选择比较重要,像你选择的这个网页,同类信息含量少,编制成爬虫的意义也比较小。
相对而言 ...

感謝大佬!我現在實用你提供的這個網址,爬取電影名字,可否請大佬提供一個實例指點一二呀
我不明白的是我需要在的信息在很多個父類標簽下,那麽應該如何進行信息索檢
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-21 23:00:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 ooxx7788 于 2017-4-22 00:48 编辑
文质彬彬胡汉三 发表于 2017-4-21 21:49
感謝大佬!我現在實用你提供的這個網址,爬取電影名字,可否請大佬提供一個實例指點一二呀
我不明白的是 ...

  1. import requests
  2. from bs4 import BeautifulSoup

  3. url = 'https://movie.douban.com/tag/%E7%88%B1%E6%83%85'
  4. r = requests.get(url).content
  5. soup = BeautifulSoup(r, 'lxml')
  6. for each in soup.find_all('table', attrs={'width': '100%', 'class': ''}):
  7.     print(each.a.get('href'))  # 对应页面链接,可以为进一步爬取详细内容做准备。
  8.     print(each.p.text)  # 播放地区、演员、时间等信息,此处分类不明确,如果需要详细分类,可以上个链接的详细分类。
  9.     print('星数:', int(each.find_all('span')[-3].attrs.get('class')[0][-2:]) / 10)
  10.     print('评价人数:', str(each.find_all('span')[-1].text).strip('()'))
  11.     print('评分:', each.find('span', attrs='rating_nums').text)
复制代码


对于绝大多数网页来说,其实Beautiful soup很好用,当然前提是要对Beautiful soup比较熟悉。不需要写上一堆让人看不懂的正则表达式。
而其实这里基本上已经把爬取豆瓣所有电影的主要代码写完了,只需要能够遍历所有标签,就可以爬取全站电影信息了。
当然我这里没有做异常处理,里面拾取的标签中,其实有部分新上映或者未上映的电影是没有评分这个标签的,这种就需要根据情况处理了。不过这里就不太多展开了。可以自己考虑考虑。
哎哟,刚刚仔细看了看,电影名字没有获取,不过这也不是重点了,算留给你自己解决的问题吧。

输出(部分显示):
  1. https://movie.douban.com/subject/25900945/
  2. 2017-03-17(中国大陆/美国) / 艾玛·沃森 / 丹·史蒂文斯 / 卢克·伊万斯 / 凯文·克莱恩 / 乔什·加德 / 伊万·麦克格雷格 / 伊恩·麦克莱恩 / 艾玛·汤普森 / 斯坦利·图齐 / 古古·姆巴塔-劳 / 奥德拉·麦克唐纳 / 内森·麦克 / 哈蒂·莫拉汉...
  3. 星数: 4.0
  4. 评价人数: 110124人评价
  5. 评分: 7.4
复制代码


小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-22 16:30:49 | 显示全部楼层
ooxx7788 发表于 2017-4-21 23:00
对于绝大多数网页来说,其实Beautiful soup很好用,当然前提是要对Beautiful soup比较熟悉。不需要 ...

非常感謝大佬!
print('星数:', int(each.find_all('span')[-3].attrs.get('class')[0][-2:]) / 10)
print('评价人数:', str(each.find_all('span')[-1].text).strip('()'))
上面兩段代碼中,紅色標註部分應該怎樣理解?煩請大佬不吝講解
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-22 16:31:50 | 显示全部楼层
文质彬彬胡汉三 发表于 2017-4-22 16:30
非常感謝大佬!
print('星数:', int(each.find_all('span')[-3].attrs.get('class')[0][-2:]) / 10)
p ...

find_all返回的是个列表,这你就懂了吧!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-22 16:32:58 | 显示全部楼层
ooxx7788 发表于 2017-4-22 16:31
find_all返回的是个列表,这你就懂了吧!


鑽進了牛角尖,懂了!感謝大佬!
大佬在爬蟲方面有何建議?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-4-22 16:34:35 | 显示全部楼层
文质彬彬胡汉三 发表于 2017-4-22 16:32
鑽進了牛角尖,懂了!感謝大佬!
大佬在爬蟲方面有何建議?

没有,我知道的也只是皮毛。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-4-22 16:41:55 | 显示全部楼层
ooxx7788 发表于 2017-4-22 16:34
没有,我知道的也只是皮毛。

與君共勉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-27 03:27

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表