拖了好久的代码

1.首先进入页面确定自己要抓取的数据(我们要抓取的是左侧分类栏-----包括美食、火锅)
先爬取第一级分类(美食、婚纱摄影、电影),之后根据第一级链接爬取第二层(火锅)。要注意第二级的pid是第一级的classid,这样才能区分出第二级分类哪些是属于第一级的。
2.上一步我们分别把链接存入Redis,名称存入了Mongodb,这一步我们要从Redis取链接,取第二级的链接。因为我们要获取店铺的信息(所以取第二级链接就够),我们首先分析取得第一页的内容,然后找到他下一页的代码(取得下一页代码就获取整个分类的店铺)
3.获取店铺信息(根据取得的店铺链接获取对应的店铺信息)
因为我们发现http协议头和cookie我们几乎每次都用到了,所以我们将它们封装成了一个方法,以便用的时候调用。
至此,大众点评就算结束了,只不过还没取评论信息,会慢慢上。

1.py

# -*- coding: utf-8 -*-
import re
from urllib.request import urlopen
from urllib.request import Request
from bs4 import BeautifulSoup
from lxml import etree

from pymongo import MongoClient
client = MongoClient('localhost',27017)
db=client.dianping
collection=db.classification	#类别表

import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)

ii=0

def secClassFind(selector,classid):
	global ii
	ii += 1
	secItems = selector.xpath('//div[@class="sec-items"]/a')
	for secItem in secItems:
		url = secItem.get('href')
		title = secItem.text
		classid = collection.insert({'classname':title,'pid':classid})
		classurl = '%s,%s,%i,%s'%(classid,url,ii,title)
		r.lpush('classurl',classurl)

def findRootNode(url):
	headers = {'User-Agent':'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.6) Gecko/20091201 Firefox/3.5.6'}
	req_timeout = 5
	req = Request(url=url,headers=headers)
	f = urlopen(req,None,req_timeout)
	s=f.read()
	s=s.decode("utf-8")
	# beautiful 提取数据
	soup=BeautifulSoup(s,'html.parser')
	links=soup.find_all(name='li',class_="first-item")
	for link in links:
		selector = etree.HTML(str(link))
		'''
		indexTitleUrls = selector.xpath('//a[@class="index-title"]/@href')
		#获取一级类别url和title
		for titleurl in indexTitleUrls:
			print(titleurl)
		'''
		indexTitles = selector.xpath('//a[@class="index-title"]/text()')
		for title in indexTitles:
			print(title)
			classid = collection.insert({'classname':title,'pid':None})
			#第二级别url
			secClassFind(selector,classid)
			#print(rs)
			print('-------------')

		print('----------------------------------------------')

findRootNode('http://www.dianping.com/')

  2.py

# -*- coding: utf-8 -*-
import re
from urllib.request import urlopen
from urllib.request import Request
from slaver3_list import getCurPageList
from bs4 import BeautifulSoup
from lxml import etree

from pymongo import MongoClient
client = MongoClient('localhost',27017)
db=client.dianping

import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)

'''
1.从classurl中取得一个链接
2.根据此链接获得一个列表页面
3.分析获得页面上的店铺链接
4.获得下一页链接
5.继续爬取下一页信息,继续解析获得链接(重复2~5)
    直到没有下一页为止
'''
#1.从redis中获取一个链接
#classurls = bytes.decode(r.lindex('classurl',0))
shopflag = int(r.get('shopflag'))

if shopflag==0:
    collection=db.shops0    #类别表
    collection.remove({})
    r.set(')
else:
    collection=db.shops1    #类别表
    collection.remove({})
    r.set(')

r.delete('shopurl')

list = r.lrange('classurl',0,-1)
for item in list:
    classurl = bytes.decode(item)        #二进制转字符串
    arr = classurl.split(',')
    #print(arr[0])        #classid
    #print(arr[1])        #classurl
    getCurPageList(arr[0],arr[1],shopflag)
    break

'''
print(classurls)
arr = classurls.split(',')

if int(arr[2])==16:
    #调用
    getCurPageList(arr[0],arr[1])
'''

3.py

# -*- coding: utf-8 -*-
import re
#from urllib.request import urlopen
#from urllib.request import Request
from common import httpSpider
from bs4 import BeautifulSoup
from lxml import etree
from bson.objectid import ObjectId
from slaver4_shopinfo import getShopInfo

from pymongo import MongoClient
client = MongoClient('localhost',27017)
db=client.dianping
collection=None

import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)

ii=0

#id,店名,类别id
def insertShop(classid,shopList):
    global collection
    for div in shopList:
        #print(div.get("href"))
        #print(div.get('title'))
        url = div.get("href")
        shopid = collection.insert({'_id':url,'shopname':div.get('title'),'classid':ObjectId(classid)})
        # shopurl = '%s,%s,%s'%(classid,shopid,url)
        # r.lpush('shopurl',shopurl)
        getShopInfo(shopid,url)

def getCurPageList(classid,url,shopflag):
    global ii
    ii += 1
    html = httpSpider(url)
    #print(html)

    selector = etree.HTML(html)

    global collection
    if shopflag==0:
            collection=db.shops0    #店铺表
    else:
        collection=db.shops1

    divTits = selector.xpath('//div[@class="tit"]/a[@title]')
    insertShop(classid,divTits)
    '''
    for div in divTits:
        print(div.get("href"))
        print(div.get('title'))
    '''
    print('----------%i---------------'%(ii))
    #-----下一页--------------------------
    '''
    nextPage = selector.xpath('//a[@class="next"]/@href')
    if len(nextPage)>0:
        newUrl = nextPage[0]
        #print(nextPage[0])
        getCurPageList(newUrl)
    '''

4.py

# -*- coding: utf-8 -*-
import re
#from urllib.request import urlopen
#from urllib.request import Request
from common import httpSpider
from bs4 import BeautifulSoup
from lxml import etree
from bson.objectid import ObjectId

from pymongo import MongoClient
client = MongoClient('localhost',27017)
db=client.dianping
collection=db.shops    #店铺表

import redis
r = redis.Redis(host='127.0.0.1',port=6379,db=0)

def getShopInfo(shopid,shopurl):
    html = httpSpider(shopurl)
    selector = etree.HTML(html)
    briefInfo = selector.xpath('//div[@class="brief-info"]//span[@class="item"]')
    for item in briefInfo:
        print(item.text)

common.py

# -*- coding: utf-8 -*-
import urllib.request
from urllib.request import urlopen
from urllib.request import Request
import http.cookiejar

from selenium import webdriver
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

head = {
    'Connection': 'Keep-Alive',
    'Accept': 'text/html, application/xhtml+xml, */*',
    'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.94 Safari/537.36',
}

def makeMyOpener(head):
    cj = http.cookiejar.CookieJar()
    opener = urllib.request.build_opener(urllib.request.HTTPCookieProcessor(cj))
    header = []
    for key, value in head.items():
        elem = (key, value)
        header.append(elem)
    opener.addheaders = header
    return opener
def httpSpider(url):
    oper = makeMyOpener(head)
    req_timeout = 5
    uop = oper.open(url, timeout = req_timeout)
    data = uop.read()
    html = data.decode()
    return html

def dynamicSpider(url):
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5) AppleWebKit/603.2.4 (KHTML, like Gecko) Version/10.1.1 Safari/603.2.4',
        'Connection': 'keep-alive'
    }
    cap = DesiredCapabilities.PHANTOMJS.copy()    #使用copy()防止修改原代码定义dict
    for key, value in headers.items():
        cap['phantomjs.page.customHeaders.{}'.format(key)] = value
    cap["phantomjs.page.settings.loadImages"] = False
    driver = webdriver.PhantomJS(desired_capabilities=cap,executable_path='D:/phantoms/phantomjs-2.1.1-windows/bin/phantomjs.exe')
    driver.get(url)
    html = driver.page_source
    driver.quit()
    return html

python爬取大众点评的更多相关文章

  1. python爬取大众点评并写入mongodb数据库和redis数据库

    抓取大众点评首页左侧信息,如图: 我们要实现把中文名字都存到mongodb,而每个链接存入redis数据库. 因为将数据存到mongodb时每一个信息都会有一个对应的id,那样就方便我们存入redis ...

  2. Python 爬取大众点评 50 页数据,最好吃的成都火锅竟是它!

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 胡萝卜酱 PS:如有需要Python学习资料的小伙伴可以加点击下方链 ...

  3. 用Python爬取大众点评数据,推荐火锅店里最受欢迎的食品

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:有趣的Python PS:如有需要Python学习资料的小伙伴可以加点 ...

  4. python爬虫实战---爬取大众点评评论

    python爬虫实战—爬取大众点评评论(加密字体) 1.首先打开一个店铺找到评论 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经 ...

  5. python爬虫爬取大众点评并导入redis

    直接上代码,导入redis的中文编码没有解决,日后解决了会第一时间上代码!新手上路,多多包涵! # -*- coding: utf-8 -*- import re import requests fr ...

  6. Python爬虫丨大众点评数据爬虫教程(1)

    大众点评数据获取 --- 基础版本 大众点评是一款非常受普罗大众喜爱的一个第三方的美食相关的点评网站. 因此,该网站的数据也就非常有价值.优惠,评价数量,好评度等数据也就非常受数据公司的欢迎. 今天就 ...

  7. Python 爬取所有51VOA网站的Learn a words文本及mp3音频

    Python 爬取所有51VOA网站的Learn a words文本及mp3音频 #!/usr/bin/env python # -*- coding: utf-8 -*- #Python 爬取所有5 ...

  8. python爬取网站数据

    开学前接了一个任务,内容是从网上爬取特定属性的数据.正好之前学了python,练练手. 编码问题 因为涉及到中文,所以必然地涉及到了编码的问题,这一次借这个机会算是彻底搞清楚了. 问题要从文字的编码讲 ...

  9. python爬取某个网页的图片-如百度贴吧

    python爬取某个网页的图片-如百度贴吧 作者:vpoet mail:vpoet_sir@163.com 注:随意copy,不用告诉我 #coding:utf-8 import urllib imp ...

随机推荐

  1. 在Github发布自己的compile包

    Android入门到转行做服务员--在Github发布自己的compile包 2017-12-05 15:27:10 这是一粒代码发布的第一篇博客,一粒代码从事android开发,近期打算开始搞搞博客 ...

  2. memcached 缓存数据库应用实践

    1.1 数据库对比 缓存: 将数据存储到内存中,只有当磁盘胜任不了的时候,才会启用缓存   缺点:断电数据丢失(双电),用缓存存储数据的目的只是为了应付大并发的业务. 数据库: mysql(关系型数据 ...

  3. Web应用与应用层协议

    Web应用与应用层协议 本篇博文中的主要参考文献是<计算机网络高级教程>,分别是吴功宜老先生和吴英教授合著.这部教程是我研究生老师所推荐的网络必读科目,由于该教程讲解的基础知识详细,但内容 ...

  4. unity中调用其他脚本函数的方法(小白之路)

    第一种,被调用脚本函数为static类型,调用时直接用  脚本名.函数名().很不实用-- 第二种,GameObject.Find("脚本所在物体名").SendMessage(& ...

  5. Keepalived实现双机热备

    第一步.安装.网上很多源码安装的步骤.咱们这里以最快的方式 . [Shell] 纯文本查看 复制代码 ? 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 ...

  6. Nginx如何配置虚拟主机?

    注意,该环境是依赖于http://www.php20.com/forum.php?m ... &extra=page%3D1 基础上进行配置.默认不具备这些文件 .下面是增加一个mytest点 ...

  7. netty使用从0到1

    本周强总在组内做了netty分享,内容相当不错,趁着这次分享记录的,以及以前研究,进行一下记录. java io形式存在三种,一种是BIO传统IO是阻塞IO,面向字符.字节服务都属于这一种.NIO官方 ...

  8. QWT与QT Designer

    QWT是一套非常不错的开发库,它能结合QT开发,做出非常好的曲线,刻度,表盘等效果来.  qwt的下载以及动态链接库的编译等这里就不做介绍了.在源码目录下可以找到designer目录,其中有插件的源码 ...

  9. 第五章 MVC之 FileResult 和 JS请求二进制文件

    一.FileResult 1.简介 表示一个用于将二进制文件内容发送到响应的基类.它有三个子类: FileContentResultFilePathResultFileStreamResult 推荐阅 ...

  10. DEBUG技巧-设定合适的日志级别

    有些技能只有踩过坑的人才能够掌握,能用来避免后来的坑,很多时候是用凌晨的时间换来的,我们通常把他叫做经验. 故事 这个一个关于springmvc的坑的故事. 某天晚上本打算一个小功能分分钟搞定上线,但 ...