python如何爬取豆瓣_python 爬虫之 爬取豆瓣网话题
获取到以上信息后就可以开始写爬虫了
首先创建一个py文件,然后引入必要的包
import re,urllibfrombs4 import BeautifulSoup
import datetime, time
然后创建一个类:
class DouBanCrawler(object):
在这个类下写所有逻辑代码
1:初始化数据方法:
def __init__(self):'''Constructor''' self.session = SessionCrawler(sleepRange=[3, 8])
self.headers={'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8','Accept-Encoding': 'gzip, deflate','Accept-Language': 'zh-CN,zh;q=0.8','Cache-Control': 'max-age=0','Connection': 'keep-alive','Host': 'www.douban.com','Upgrade-Insecure-Requests': '1'}
这段代码我将headers参数全局话调用,内容是刚刚用f12查看到的
然后我用的是session工具来进行http请求,其中
self.session = SessionCrawler(sleepRange=[3, 8])
SessionCrawler是我封装的外部类
内容如下:
import requests
import time
import random
import tracebackclass SessionCrawler(object):'''classdocs'''def __init__(self, session=None, sleepRange=[1,2], logger=None):'''Constructor''' if session isNone:
self.session=requests.session()else:
self.session=session
self.sleepRange=sleepRange
self.lastCrawlTime= 0defget(self, url, textRspOnly=True, **kwargs):
#self.randomSleep()
result= self.session.get(url,**kwargs)
self.lastCrawlTime=time.time()iftextRspOnly:returnresult.textelse:returnresult
def randomSleep(self):if time.time() - self.lastCrawlTime < self.sleepRange[0]:
sleepTime=self.sleepRange[0] + (self.sleepRange[1]-self.sleepRange[0])*random.random()
time.sleep(sleepTime)
调用外部库的时候这么写:
from com.naswork.sentiment.crawler.sessioncrawler import SessionCrawler
com.naswork.sentiment.crawler.sessioncrawler是外部文件库存放地址
做好初始化准备工作后我们就可以正式分析爬虫如何写了
def searchArticle(self, keywordList, endTime):'''根据关键字数组,开始时间和结束时间范围搜索文章
@param keywordList: 关键字数组
@param endTime: 搜索时间范围结束''' startTime = endTime - datetime.timedelta(hours=1)page= 0 #是否翻页爬取articleList=list()
hasnext=True #是否有下一条符合记录的帖子需要爬取whilehasnext:
(articleListInPage, hasnext)=self.__searchByPage(keywordList, startTime, endTime, page)
articleList.extend(articleListInPage)
page+= 50
return articleList
searchArticle方法用来当作程序的入口
self.__searchByPage(keywordList, startTime, endTime, page)就是插入搜索关键词,
然后设置搜索话题的发布时间范围和搜索页数
具体代码如下:
def __searchByPage(self,keywordList,startTime,endTime,page):
# 在豆瓣内部搜索框搜索
page=str(page) #url接收的是str格式
search_url= "https://www.douban.com/group/search?start="+page+"&cat=1013&sort=time&q="#cat:按话题搜索 sort:按最新发布时间分类 q:搜索关键词
query= urllib.quote(' '.join(keywordList).encode('utf-8'))
search_url= search_url+str(query)
url_page= self.session.get(search_url,headers=self.headers)
soup= BeautifulSoup(url_page, "lxml")
main_wrap= soup.find('div', attrs={'class': "article"})
main_article_list= main_wrap.find('div',attrs={'class':"topics"})
articleList=list()
hasnext=Trueif main_article_list isnot None:
title_list= main_article_list.findAll('tr', {'class': 'pl'})for title intitle_list:
article_publishtime= title.find('td', attrs={'class': "td-time"}).attrs['title']
urlTime= time.strptime(article_publishtime, "%Y-%m-%d %H:%M:%S")
Y, M, D, H= urlTime[0:4]
urlTime2=datetime.datetime(Y, M, D, H)
urlTime2=time.mktime(urlTime2.timetuple())
#转换成时间戳来比较 float类型
startTime= endTime - datetime.timedelta(days=2)
startTimeIntSecond=time.mktime(startTime.timetuple())
endTimeIntSecond=time.mktime(endTime.timetuple())
#如果符合时间范围就爬取if urlTime2 >= startTimeIntSecond and urlTime2 <=endTimeIntSecond:
article_url= title.find('a').attrs['href']article_title= title.find('td', attrs={'class': "td-subject"}).text
article=Article(article_title,article_publishtime, article_url, None)
reply_count= title.find('td', attrs={'class': "td-reply"}).text.strip()
reply_count= re.sub(u'回应', '', reply_count) # 回复数量去除中文保留数字if article not inarticleList:
articleList.append(article)else:
print len(articleList)
hasnext=Falsebreak
return (articleList, hasnext)
重点是这段代码:
url_page = self.session.get(search_url,headers=self.headers)
soup = BeautifulSoup(url_page, "lxml")
将豆瓣url放入get()中发送http请求,并且发送headers请求头,返回数据保存到url_page变量中,
再接着调用BeautifulSoup插件库方法,第二个参数是html解析器
调用后就可以将获取到的url_page(string)格式的网页源码以html格式编码
那么,就可以通过find() findAll()来进行html标签的获取查找了
比如说我要获取下面的内容:
那么可以这么写:
main_wrap = soup.find('div', attrs={'class': "article"})那么,main_wrap变量保存的就是图中div标签(class=article)的包裹内容以及它本身
然后要找main_wrap里的内容也可以通过find查找:
main_children = main_wrap.find('div', attrs={'class': "srh-filter"})
总之一句话:获取父标签的对象,然后通过父标签对象一层层往下找子对象内容
然后
reply_count = re.sub(u'回应', '', reply_count) # 回复数量去除中文保留数字
这里的re.sub()是可以去除我们不想要的内容,例如:123回应
将 回应 二字设为‘’ (空)就可以只保留123 数字了
Article()类是额外写的用来保存文章信息。也就是写一个用来保存数据的返回类。
python如何爬取豆瓣_python 爬虫之 爬取豆瓣网话题相关推荐
- python爬虫教材推荐 豆瓣_Python爬虫入门教程:豆瓣Top电影爬取
基本开发环境Python 3.6 Pycharm 相关模块的使用requests parsel csv 安装Python并添加到环境变量,pip安装需要的相关模块即可. 爬虫基本思路 一.明确需求 爬 ...
- python爬虫爬取歌曲_python爬虫实战:爬取全站小说排行榜
喜欢看小说的骚年们都知道,总是有一些小说让人耳目一新,不管是仙侠还是玄幻,前面更了几十章就成功圈了一大波粉丝,成功攀上飙升榜,热门榜等各种榜,扔几个栗子出来: 新笔趣阁是广大书友最值得收藏的网络小说阅 ...
- python访问多个网页_Python 爬虫 2 爬取多页网页
本文内容: Requests.get 爬取多个页码的网页 例:爬取极客学院课程列表 爬虫步骤 打开目标网页,先查看网页源代码 get网页源码 找到想要的内容,找到规律,用正则表达式匹配,存储结果 Re ...
- python爬虫爬取图片代码_python爬虫实战 爬取天极图片
学习爬虫个人的意见是直接实战效果会很好 不要等全学完requests ,正则表达式,BeautifulSoup等再来实际操作.其实很多实战我们并不会用到requests库,BeautifulSoup, ...
- python爬虫爬取京东_Python爬虫学习 爬取京东商品
1. 本节目标 以抓取京东 App 的商品信息和评论为例,实现 Appium 和 mitmdump 二者结合的抓取.抓取的数据分为两部分:一部分是商品信息,我们需要获取商品的 ID.名称和图片,将它们 ...
- python爬虫爬取房源_Python爬虫项目--爬取自如网房源信息
本次爬取自如网房源信息所用到的知识点: 1. requests get请求 2. lxml解析html 3. Xpath 4. MongoDB存储 正文 1.分析目标站点 1. url: http:/ ...
- python多线程爬取段子_python爬虫(爬取段子)
python爬取段子 爬取某个网页的段子 第一步 不管三七二十一我们先导入模块 #http://baijiahao.baidu.com/s?id=1598724756013298998&wfr ...
- python爬虫爬取视频_python爬虫:爬取网站视频
新建一个py文件,代码如下: #!/usr/bin/python # -*- coding: UTF-8 -*- import urllib,re,requests import sys reload ...
- python3爬虫豆瓣_Python爬虫(3)豆瓣登录
前面(1)(2)的内容已经足够爬虫如链家网之类的不需要登录可以直接获取数据的网站. 而要爬取社交网站比较鲜明的特点就是需要登录,否则很多东西都无法获取.经过测试发现,微博,知乎都不是很好登录,知乎有时 ...
最新文章
- 通过yiic来创建yii应用
- python多线程代码_Python多线程代码求改错
- Action中五个常量解释,(success,error,input,login,none)
- 「镁客早报」韩国将支持数字加密货币的正常交易;今年智能手表出货量或达7100万部...
- MariaDB Galera Cluster with HA Proxy and Keepalived on Cents 6
- 流量专家为114搜索提供权威流量访问统计
- 7-227 PAT排名汇总 (25 分)
- sql游标循环结果集
- Bailian3860 Bailian3724 unix纪元【日期时间】
- SQLite语法与Android数据库操作
- 紫鸟超级浏览器-SeleniumAPI通信
- Python报错:ValueError: operands could not be broadcast together with shapes
- PNETLAB模拟器汉化使用
- Windows更新错误代码0x8007000e
- 大数据分析常用的工具有哪些(一)
- PHP 毕生功力 图片,视听发烧网_汇集毕生功力的代表作:静神Monitor Acoustics KenStyle Silver Signature...
- bmob php支付,GitHub - bmob/bmob-php-sdk: PHP SDK相关源码
- android实现课程表界面
- 【单细胞分析】P2.5、聚类,筛选marker基因,可视化
- shell编程之sort、uniq、tr