双十一还没消停,双十二又来了。看返利网<今日值得买>的数据时时不断的在更新。。。。。。

1.爬取返利网的商品名,分类,推荐人,好评数和差评数

2.商品信息不断更新,查看页面源代码仅可以看见一开始显示的几个商品的代码。

页面加载规律是往下拉页面,便加载5个商品,一页有50个商品。

所以,还是打开谷歌浏览器,按F12,向下拉页面,使数据完全加载完毕。

一开始并不知道数据存在哪,便一个一个点开看,查找数据。

发现红框里的才是所需要的.

3.然后便是找网址的规律

可以发现,每页有10个小块,因为每页打开时第1页页面源代码中是有的,在这里没有显示,但同样也可打开。而且第11页是不需要的。第1个数字代表了第几页,第2个数字代表了每页加载的第几个模块。

这是用相同规律的网址打开的第一个小模块:

这是第11个小模块,里面没有数据:

4.先开始爬取一个小模块的数据

获取网址后,右键查看页面源代码,可以使用BeautifulSoup模块爬取内容

观察这些代码可以发现,每一个商品都是一个div,详细信息包含在各个a标签中。

开始的思路是获取所有a标签,然后通过列表索引取值就可以了。这样的确是可以的,不过仅对小模块里的第一个商品有效。比如:

第一个div里有10个a标签,获取想要的数据可以索引取值比如为a[0],a[3],a[5]

如果以下的各个div也均有10个a标签,且顺序位置相同,则可以按照递增序列加值,那么获取第二个小模块应为a[10],a[13],a[15]

可是,通过看源代码知道,div中a标签的数量是不一致的,有10个的,有12个的,所以写着写着这种方法就被自己否决了。

接着看源代码,发现想要获取的数据所在的每个a标签中均有class,然后就想通过class去匹配a标签。

所以代码为:

<span style="font-size:18px;">#coding:utf-8
import urllib
import re
from bs4 import BeautifulSoup
def getHtml(url):page=urllib.urlopen(url)html=page.read()return html
def getItems(html):rep=re.compile(' J_tklink_tmall')#匹配这个的原因是想要获取的a标签中有的有这个类名,影响匹配,所以把它替换掉才能都匹配出来data=rep.sub('',html)soup=BeautifulSoup(data)name_list=soup.find_all('a',class_='J-item-track nodelog')#商品名称fenlei_list=soup.find_all('a',class_='nine')#分类usr_list=soup.find_all('div', class_='item-user')#推荐人yes_list=soup.find_all('a',class_='l item-vote-yes J-item-vote-yes')#好评no_list=soup.find_all('a',class_='l item-vote-no J-item-vote-no')#差评for i in range(0,5):print name_list[i].get_text(strip=True).encode("utf-8")+'|'\+fenlei_list[i].get_text(strip=True).encode("utf-8")+'|'\+usr_list[i].get_text(strip=True).encode("utf-8")+'|'+\yes_list[i].get_text(strip=True).encode("utf-8")+'|'+\no_list[i].get_text(strip=True).encode("utf-8")+'|'+'\n'
url='http://zhide.fanli.com/index/ajaxGetItem?cat_id=0&tag=&page=1-1&area=0&tag_id=0&shop_id=0'
html=getHtml(url)
getItems(html)</span>

5.爬取多页的数据,先爬前50页的数据

因为url中有两个变量,因此相当于一个二维数组,需要两次for循环。

代码:

<span style="font-size:18px;">#coding:utf-8
import urllib2
import re
from bs4 import BeautifulSoup
class fanli():def __init__(self):self.usr_agent='Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'self.headers={'usr_agent',self.usr_agent}self.p=1self.pageIndex=1def getHtml(self,p,pageIndex):try:#只获取第一页的数据,网址只需要传入P参数即可。即:#url='http://zhide.fanli.com/index/ajaxGetItem?cat_id=0&tag=&page=1-'+str(p)+'&area=0&tag_id=0&shop_id=0'url='http://zhide.fanli.com/index/ajaxGetItem?cat_id=0&tag=&page='+str(pageIndex)+'-'+str(p)+'&area=0&tag_id=0&shop_id=0'request=urllib2.Request(url)page=urllib2.urlopen(request)html=page.read()return htmlexcept urllib2.URLError,e:if hasattr(e,'reason'):print u'连接失败',e.reasonreturn Nonedef getItems(self):with open('fanli.txt','a') as f:f.write('商品名称'+'|'+'分类'+'|'+'推荐人'+'|'+'好评数'+'|'+'差评数'+'\n')for pageIndex in range(1,51):#IndexError:list index out of range在第11页出现的问题for p in range(1,11):html=self.getHtml(pageIndex,p)rep=re.compile(' J_tklink_tmall')data=rep.sub('',html)soup=BeautifulSoup(data)name_list=soup.find_all('a',class_='J-item-track nodelog')#商品名称fenlei_list=soup.find_all('a',class_='nine')#分类usr_list=soup.find_all('div', class_='item-user')#推荐人yes_list=soup.find_all('a',class_='l item-vote-yes J-item-vote-yes')#好评no_list=soup.find_all('a',class_='l item-vote-no J-item-vote-no')#差评f=open('fanli.txt','a')for i in range(0,5):f.write(name_list[i].get_text(strip=True).encode("utf-8")+'|'\+fenlei_list[i].get_text(strip=True).encode("utf-8")+'|'\+usr_list[i].get_text(strip=True).encode("utf-8")+'|'\+yes_list[i].get_text(strip=True).encode("utf-8")+'|'\+no_list[i].get_text(strip=True).encode("utf-8")+'|'+'\n')f.close()
spider=fanli()
spider.getItems()</span>

代码看似正确,不过却报错了,就在27行往下,不知道哪个list超出了索引范围。然后修改了第27行的for循环,改成range(1,11),则正常运行。一旦改成12,即数据爬到11页时,就会出现错误。于是又根据爬取单页的代码单独爬取了第11页的数据,居然是完整不报错的爬出来了!!

经大神指教,用try……except抛出异常,然后continue.............

结果还是不对!!maybe,,,,,我的try……except用错了!

啊哦~~~~~~~~~~~~

===============================我是华丽丽的分割线=========================================
终于知道错在哪了!!!!啊啊啊啊啊哦~~~~

Python传参是要按照顺序来的!!我把这个居然给忘了。。。

获取网页时参数的性质是这样写的:

而调用函数时参数的顺序写错了:

所以调换顺序即可,这样就可以正常运行了。

如果定义的getHtml()函数的参数不修改的话,要么调换调用时的顺序,要么将函数调用时进行赋值说明,即:

就可以了。

所以最终正确的代码为:

#coding:utf-8
import urllib2
import re
from bs4 import BeautifulSoup
class fanli():def __init__(self):self.usr_agent='Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/46.0.2490.86 Safari/537.36'self.headers={'usr_agent',self.usr_agent}self.p=1self.pageIndex=1def getHtml(self,pageIndex,p):try:url='http://zhide.fanli.com/index/ajaxGetItem?cat_id=0&tag=&page='+str(pageIndex)+'-'+str(p)+'&area=0&tag_id=0&shop_id=0'request=urllib2.Request(url)page=urllib2.urlopen(request)html=page.read()return htmlexcept urllib2.URLError,e:if hasattr(e,'reason'):print u'连接失败',e.reasonreturn Nonedef getItems(self):with open('fanli.txt','a') as f:f.write('商品名称'+'|'+'分类'+'|'+'推荐人'+'|'+'好评数'+'|'+'差评数'+'\n')for pageIndex in range(1,51):for p in range(1,11):html=self.getHtml(pageIndex,p)rep=re.compile(' J_tklink_tmall')data=rep.sub('',html)soup=BeautifulSoup(data)name_list=soup.find_all('a',class_='J-item-track nodelog')#商品名称fenlei_list=soup.find_all('a',class_='nine')#分类usr_list=soup.find_all('div', class_='item-user')#推荐人yes_list=soup.find_all('a',class_='l item-vote-yes J-item-vote-yes')#好评no_list=soup.find_all('a',class_='l item-vote-no J-item-vote-no')#差评f=open('fanli.txt','a')for i in range(0,5):f.write(name_list[i].get_text(strip=True).encode("utf-8")+'|'\+fenlei_list[i].get_text(strip=True).encode("utf-8")+'|'\+usr_list[i].get_text(strip=True).encode("utf-8")+'|'\+yes_list[i].get_text(strip=True).encode("utf-8")+'|'\+no_list[i].get_text(strip=True).encode("utf-8")+'|'+'\n')f.close()
spider=fanli()
spider.getItems()

还有需要注意的是,这次代码中urllib2.Request()没有传入headers参数,因为报错了。

AttributeError: 'set' object has no attribute 'items'

将headers去掉就能正常运行了。

Python爬取返利网(今日值得买)数据相关推荐

  1. python爬取返利网

    最近一段时间试着爬取了返利网的[今日值得买网页]http://zhide.fanli.com/p1?spm=global.pc.buid-todayworth 在这想要爬取商品名称.分类.推荐人.商品 ...

  2. python爬取东方财富网,并将数据导入mysql

    1.首先使用xpath获取网页中的表格数据,需要下载谷歌及与之版本相同的相关程序, 链接如下:ChromeDriver Mirror 我下载的正好是压缩过后就是如下程序: 2.然后就是连接mysql数 ...

  3. python 爬取贝壳网小区名称_用Python爬取贝壳网新房和二手房数据

    [Python] 纯文本查看 复制代码import random import requests from bs4 import BeautifulSoup import re import math ...

  4. python爬取东方财富网资金流向数据(在本地生成csv文件)

    今天我们来试着用python爬取东方财富网资金流向的表格数据. 第一步:程序及应用的准备 首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的c ...

  5. 在当当买了python怎么下载源代码-Python爬取当当网最受欢迎的 500 本书

    想看好书?想知道哪些书比较多人推荐,最好的方式就是看数据,接下来用 Python 爬取当当网五星图书榜 TOP500 的书籍,或许能给我们参考参考! Python爬取目标 爬取当当网前500本受欢迎的 ...

  6. 利用python爬取东方财富网股吧评论并进行情感分析(一)

    利用python爬取东方财富网股吧评论(一) python-东方财富网贴吧文本数据爬取 分享一下写论文时爬数据用到的代码,有什么问题或者改善的建议的话小伙伴们一起评论区讨论.涉及内容在前人的研究基础之 ...

  7. python爬取当当网商品评论

    python爬取当当网商品评论 本案例获取某鞋评论作为例 案例目的: 通过爬取当当网商品评价,介绍通过结合jsonpath和正则表达式获取目标数据的方法. 代码功能: 输入爬取的页数,自动下载保存每页 ...

  8. Python爬取豆瓣网影评展示

    Python爬取豆瓣网影评展示 需要的库文件 requests beautifulsoup wordcloud jieba matplotlib 本文思想 1.访问指定的网页 #获取指定url的内容 ...

  9. 用python爬取高考网历年高考分数线将数据放入MySQL并绘制图表

    用python爬取高考网历年高考分数线 # 导入爬虫的库 import requests from lxml import etree # 导入画图库 from pyecharts.charts im ...

最新文章

  1. 10年Java老兵宝藏资料,吐血奉献!
  2. 5年後、10年後の自分のイメージ
  3. mysql内存体系结构_Innodb存储引擎的体系架构之内存
  4. 《深入理解Nginx》阅读与实践(四):简单的HTTP过滤模块
  5. python列表生成多个号码_python按需生成固定数量电话号码并保存为excel(不重复)...
  6. 【2012百度之星/资格赛】D:共同狂欢
  7. 面试题整理(机器学习、数据结构)
  8. 致我们最最最最最最最最最最最最最优秀的班主任——王老师
  9. 电脑提示0xc0000719设备未迁移如何解决
  10. modbus tcp主站和从站_【智】S7200PLC与台达变频器MODBUS轮询实时读取详解
  11. android 录音命令,音频延迟  |  Android NDK  |  Android Developers
  12. 元宵节正月十五素材图片,可以做壁纸高清!
  13. 为什么mysql没有io多路复用_Redis凭啥可以这么快
  14. 【CCCC】L2-031 深入虎穴 (25分),,求多叉树最深的节点编号,大水题!!!
  15. 推荐一本学javascript的书籍---经典
  16. Google的设计原则
  17. GlusterFS元数据机制分析
  18. 5款OCR文字识别软件推荐_分享好用的OCR(图片转文字)工具
  19. 抖音如何吸引精准流量?短视频引流应该怎么做
  20. 聊天机器人chatbot搭建及思考(TensorFlow)(附代码)

热门文章

  1. Mysql8创建用户以及赋权操作
  2. edas上传pdf 失败
  3. 项目__网页版聊天室
  4. 非常有趣有特色的个人博客网站源码
  5. 经济学基础(本)【3】
  6. tableau通过集动作改变突出显示
  7. python 归一化feed-dict程序代码_深度学习-中国大学mooc-题库零氪
  8. eclipse报错!!!!
  9. N型半导体和P型半导体
  10. 前端:HTML+CSS+JavaScript实现轮播图