返利网--今日值得买--python爬虫

  做了一个返利网爬虫,想和大家分享一下,在新浪博客中写了写,一不小心切换了界面,写的东西也丢了。有点小失落~

  言归正传,说说我的这次返利网的爬虫经历^\/^

  返利网的“今日值得买”版块每天都有数据更新,而且汇集了各大电商网站,包括淘宝、京东、易迅等网站的促销打折商品,所以能在这里有点数据的积累,做一个文本数据挖掘,可能会发现一些价值。

  首先看一下“今日值得买”版块的首页,能不能找到什么规律

  你发现了吗?反正我没有。。。不过碰巧打开了“今日值得买”的第二页商品信息,结果奇迹出现了,URL改变了!!!网址竟然变成了zhide.fanli.com/p2,这就让人觉得有意思了,通过男人的第六感,我深深地感受到这URL中存在规律。

然后我打开了“今日值得买”的第一页信息,看看这页的URL是什么?!果真,和猜想的一样,是zhide.fanli.com/p1,那就问题很可能就解决了

  试试zhide.fanli.com/p3如果能打开第三页信息,那么问题解决了:URL的变化就是p后面数字的变化。验证一下,猜想正确!!

  真正难以解决的问题,现在能进入的网站是“今日值得买”的首页,真正的想获取商品的详细信息和买家的评论还需要点击商品的链接,进入商品信息界面才能进行采集,所访问商品的链接是必须的。但是商品信息的链接都是由随机数形成的,没有什么规律,怎么办呢?

  所以想办法获取这些随机数,也就是商品的编号,问题可能会解决。起初我是随机生成URL的后三位数字,发现有些网址能进,有些不能进,还有好多不是今天更新的数据;所以我就想到了能不能通过遍历“今日值得买”的每一页的信息,获取商品的编号,从而访问商品的链接信息呢?!经过实践肯定了我的想法。。。

  上代码!!!

#coding=utf-8
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
import urllib2
import re
from bs4 import BeautifulSoup
import time
import socket
#返利网ip为fanly_url
fanly_path="F:\yaozhi\yaozhi.txt"
fanly_url="http://zhide.fanli.com/p"
format_url="http://zhide.fanli.com/detail/1-"
reg=r'data-id="\d{6}"'
reg2=r"\d{6}"
reg3='"lowest-network"'
reg4=r'<.+?>'
result=re.compile(reg)
class faly():
    def __init__(self):
        #初始化头文件  'User-Agent'
        self.user_agent='Mozilla/5.0 (Windows NT 6.1; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0'
        self.html_data=[]
    def get_html(self,start_page=1,end_page=20):
        if start_page<1:
            return "页码输入错误"
        elif end_page>100:
            return "页码超出范围,请输入1-100的整数!"
        for i in range(start_page,end_page+1):
            print("----正在采集%d页的数据----"%i)
            rt=urllib2.Request(fanly_url+str(i))
            rt.add_header( 'User-Agent',self.user_agent)
#网络连接可能会出现问题,存在ip被封的风险,得到需要采集的网页的html
            try:
                my_data = urllib2.urlopen(rt).read()
                self.html_data.append(my_data)
                time.sleep(2)
                socket.setdefaulttimeout(15)
            except urllib2.URLError, e:
                if hasattr(e,'reason'):
                    print u"连接失败",e.reason
        return  str(self.html_data)
#print(faly().get_html())
class GetData():
    def __init__(self):
        self.html=faly().get_html()
        self.href=[]
        self.ls=[]
        self.url=[]
#通过获取href的值,得到实际需要访问的网址,网址变化的只是后面的数字,用正则表达式匹配,然后进行去重
    def get_hrefurl(self):
        tag=result.findall(self.html)
        for i in tag:
            self.href.append(i)
        result2=re.findall(reg2,str(self.href))
        if len(result2):
            for data in result2:
                if data not in self.ls:
                    self.ls.append(data)
                    url=format_url+str(data)
                    self.url.append(url)
        return self.url
#print GetData().get_hrefurl()

#获取商品的具体信息,包括打折商品网站、商品价格、简介等信息
class Href_mg():
    def __init__(self):
        self.list=GetData().get_hrefurl()
        self.txt_list=[]
    def show_mg(self):
        for item in range(len(self.list)):
            if len(self.list):
                url=str(self.list[item])
                mg=urllib2.Request(url)
                try:
                    req=urllib2.urlopen(mg).read()
                    soup=BeautifulSoup(req,"html.parser")
                    txt=soup.find_all('h1')
                    self.txt_list.append(txt)
                except urllib2.URLError,e:
                    print e.reason
        return str(self.txt_list).decode("unicode_escape")

#print  Href_mg().show_mg()
if __name__ == "__main__":
#提取文档,规整数据,写入本地
    with open(fanly_path,'a') as file:
        data=Href_mg().show_mg()
        data_s=re.sub(reg4,' ',data).replace('全网最低','').replace('[','').replace(']','').replace(',','\n').strip().replace('  ','')
        file.write(str(data_s))

  代码比较简单,还差一些买家评论没有采集,既然找到了规律,采集这个网站其他的数据也就是分分钟的事情。

 

posted @ 2015-10-25 17:27  小步快跑&  阅读(1776)  评论(0编辑  收藏  举报