今天继续学习一些实战爬虫
链接爬虫实战
要求:把一个网页里所有的链接地址提取出来
思路:(1)确定爬取的入口链接
(2)构建提取链接的正则表达式
(3)模拟浏览器爬取网页
(4)根据正则表达式提取链接
(5)过滤掉重复的链接
(6)后续操作
比如我们来获取 http://blog.csdn.net/下的链接
import re
import urllib.request
import urllib.error
def getlink(url):
#模拟浏览器访问
headers=('User-Agent','Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
opener=urllib.request.build_opener()
opener.addheaders=[headers]
#将opener安装成全局
urllib.request.install_opener(opener)
file=urllib.request.urlopen(url)
data=str(file.read())
#构建正则表达式
pat='(https?://[^\s)";]+\.(\w|/)*)'
#
link=re.compile(pat).findall(data)
#去除重复元素,只需要将link设为set集合再转为list就可以了
link=list(set(link))
return link
#要爬取得网页
url="http://blog.csdn.net/"
linklist=getlink(url)
for link in linklist:
print(link[0])
获取成功,这里需要弄懂的是链接的正则表达式,很多地方都有用:(https?://[^\s)";]+\.(\w|/)*)
糗事百科爬虫实战
我们先来分析各个网页的网址规律,构造网址变量,通过for循环爬取多页的内容
实现一个自定义函数专门用来爬取某网页的段子,这里和我们上次爬取图片差不多
import re
import urllib.request
import urllib.error
def getcontent(url,page):
#--------
# 模拟浏览器访问
headers = ('User-Agent',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装成全局
urllib.request.install_opener(opener)
#---------
data=urllib.request.urlopen(url).read().decode("utf-8")
#构建对应用户提取的正则表示
userpat='alt="(.*?)">'
#构建段子内容提取的正则表达式
contentpat='<div class="content">(.*?)</div>'
#寻找所有的用户
userlist=re.compile(userpat,re.S).findall(data)
#寻找所有的内容
contentlist=re.compile(contentpat,re.S).findall(data)
x=1
#循环遍历段子内容并赋值
for content in contentlist:
#去除换行
content=content.replace("\n","")
content = content.replace("<span>", "")
content = content.replace("<br/>", "")
content = content.replace("</span>", "")
#用字符串作为变量名,先将对应的字符串赋值给一个变量
name="content"+str(x)
#exec函数实现用字符串作为变量名并且赋值
exec(name+'=content')
x+=1
y=1
#遍历用户,输出用户对应内容
for user in userlist:
name="content"+str(y)
print("用户"+str(page)+str(y)+"是:"+user)
print("内容是:")
exec("print("+name+")")
print("\n")
y+=1
#执行循环获取
for i in range(1,10):
url="http://www.qiushibaike.com/text/page/"+str(i)
getcontent(url,i)
现在这个网站改版了,爬取的内容好像显示不全。网站代码改版,我们就要更换url和正则表达式,否则爬不到,自己分析网页结构,做到灵活运用。
现在知道如何爬取网页范围内的文字,并且自己能给出一些修饰删减就好了。
微信文章爬虫实战
我们在爬取微信的时候会比较麻烦,因为我们的ip会经常被封杀。那么我们就要解决这个问题。
首先我们人工进行查阅,再用爬虫自动化。我们先进入搜狗的搜索平台:http://weixin.sougou.com
我们分析一下发现如果没有type字段则搜索的不是文章。query是我们请求关键词的信息,我输入的关键词是物联网。
我们点击下一页发现
page字段出现了为2,所以是控制页数的字段。接下来我们构造网址
我们接着再观察源代码:
<div class="txt-box">
<h3>
<a target="_blank" href="http://mp.weixin.qq.com/s?src=11&timestamp=1548826683&ver=1397&signature=DUmrUskDf4kb9Th4olLcy2F2Li51-*RrCB6cXU2XWjTxiekW6y5qX4MCG9xKlcv5ezvo8vylV5ku9hqEs7H0MraeRAE8n9LEJU4C-IK6C1N4MS-PqLaUKZvd-3H-b9K2&new=1" id="sogou_vr_11002601_title_0" uigs="article_title_0" data-share="http://weixin.sogou.com/api/share?timestamp=1548826683&signature=qIbwY*nI6KU9tBso4VCd8lYSesxOYgLcHX5tlbqlMR8N6flDHs4LLcFgRw7FjTAONa2V-2x1W7AuuzD-vidXm3GvlytfD8sJy6-UegQq2dXx0gPni92wd2H9cr4shLXudn7EEa0mG*bje1CgQ1SR-P8d6sgbQ1VL0s2tJAntd0Vk-pwsL-vVvo1Uywe4YR*hx*PHSUyQNaBBUB185MtR9P4yramVOBzGCkA2Z2uWLZo=">[<em><!--red_beg-->物联网<!--red_end--></em>]是中国的!<em><!--red_beg-->物联网<!--red_end--></em>时代,且看中国!</a>
得到正则表达式: '<div class="tex-box">.*?(http://.*?)"'
这样我们可以使用相关函数提取出指定页数的文章网址出来
但是我们访问的时候发现网址参数错误,这时我们直接通过列表打开网址。发现提取出来的网址比真实的网址的多了&
我们可以使用replace将其代替为""即可,关于封ip的情况就要用到我们之前学习的代理ip
规划一下:我们要实现三个函数
一个是使用代理服务器爬取指定的网址并返回数据,一个是获取多个页面文章链接的功能,最后一个根据文章链接爬取指定标题和内容。
代码中如果发生异常,我们就要进行延时处理:使用time.sleep(7)方法延时7秒
import re
import time
import urllib.request
import urllib.error
# 1模拟浏览器访问
headers = ('User-Agent',
'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36')
opener = urllib.request.build_opener()
opener.addheaders = [headers]
# 将opener安装成全局
urllib.request.install_opener(opener)
# ---------
listurl=[]
def use_proxy(proxy_addr,url):
try:
import urllib.request
proxy = urllib.request.ProxyHandler({'http': proxy_addr})
opener = urllib.request.build_opener(proxy, urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data = urllib.request.urlopen(url).read().decode('utf-8')
return data
except urllib.error.URLError as e:
if hasattr(e,"code"):
print(e.code)
if hasattr(e,"reason"):
print(e.reason)
time.sleep(10)
except Exception as e:
print("exception:"+str(e))
time.sleep(1)
def getlisturl(key,pagestart,pageend,proxy):
try:
page=pagestart
keycode=urllib.request.quote(key)
pagecode=urllib.request.quote("&page")
for page in range(pagestart,pageend+1):
url="http://weixin.sogou.com/weixin?type=2&query="+keycode+pagecode+str(page)
#print("下面出不来"+url)#这里的url有点问题好像
#pagecode=urllib.request.quote("&page")我不太清楚这里为什么要编码
#我想改成不编码
#pagecode=urllib.request.quote("page")
#url="http://weixin.sogou.com/weixin?type=2&query="+keycode+"&"+pagecode+"="+str(page)
#但是这里ip有点问题,看下面
data1=use_proxy(proxy,url)
#这里data1输出为None,不知是不是IP不能用的问题
print(data1)
listurlpat='<div class="txt-box">.*?(http://.*?)"'
#print("哎呀前面没错哦")
listurl.append(re.compile(listurlpat,re.S).findall(data1))
print("获取到:"+str(len(listurl))+"页")
return listurl
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
time.sleep(7)
except Exception as e:
print("exception:" + str(e))
time.sleep(1)
def getcontent(listurl,proxy):
i=0
html1='''<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title> 微信文章页面</title>
<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
</head>
<body>'''
fh=open("D:/crawler/weixin/1.html","wb")
fh.write(html1.encode("utf-8"))
fh.close()
fh=open("D:/crawler/weixin/1.html","ab")
for i in range(0,len(listurl)):
for j in range(0,len(listurl[i])):
try:
url=listurl[i][j]
url=url.replace("amp;","")
data=use_proxy(proxy,url)
titlepat="<title>(.*?)</title>"
contentpat='id="js_content">(.*?)id="js_sq_bar"'
title=re.compile(titlepat).findall(data)
content=re.compile(contentpat,re.S).findall(data)
thistitle="此次没有获取到"
thiscontent="此次没有获取到"
if(title!=[]):
thistitle=title[0]
if(content!=[]):
thiscontent=content[0]
dataall="<p>标题为:"+thistitle+"</p><p>内容为:"+thiscontent+"</p>
"
fh.write(dataall.encode("utf-8"))
print("第"+str(i)+"网页第"+str(j)+"次处理")
except urllib.error.URLError as e:
if hasattr(e, "code"):
print(e.code)
if hasattr(e, "reason"):
print(e.reason)
time.sleep(10)
except Exception as e:
print("exception:" + str(e))
time.sleep(1)
fh.close()
html2='''</body></html>'''
fh=open("D:/crawler/weixin/1.html","ab")
fh.write(html2.encode("utf-8"))
fh.close()
#设置关键词
key="物联网"
#代理ip
proxy="27.29.77.113"
proxy2=""
pagestart=1
pageend=2
listurl=getlisturl(key,pagestart,pageend,proxy)
getcontent(listurl,proxy)
这里要么是代理ip那边出了问题,换了很多ip还是连接不上。可能是url拼接的有点问题,但是我改过后仍然有异常,
[WinError 10060] 由于连接方在一段时间后没有正确答复或连接的主机没有反应,连接尝试失败。
这个弄了一天,还没有解决。。心累。。有大佬看出来错误还请指出来,在下谢谢了。
要过年了。。提前祝大家新年快乐哈!
此文是我在学习《精通Python网络爬虫》(韦玮著)的总结,纯手打。
- Python 爬虫模拟登陆知乎
在之前写过一篇使用python爬虫爬取电影天堂资源的博客,重点是如何解析页面和提高爬虫的效率.由于电影天堂上的资源获取权限是所有人都一样的,所以不需要进行登录验证操作,写完那篇文章后又花了些时间研究了 ...
- python爬虫成长之路(一):抓取证券之星的股票数据
获取数据是数据分析中必不可少的一部分,而网络爬虫是是获取数据的一个重要渠道之一.鉴于此,我拾起了Python这把利器,开启了网络爬虫之路. 本篇使用的版本为python3.5,意在抓取证券之星上当天所 ...
- python爬虫学习(7) —— 爬取你的AC代码
上一篇文章中,我们介绍了python爬虫利器--requests,并且拿HDU做了小测试. 这篇文章,我们来爬取一下自己AC的代码. 1 确定ac代码对应的页面 如下图所示,我们一般情况可以通过该顺序 ...
- python爬虫学习(6) —— 神器 Requests
Requests 是使用 Apache2 Licensed 许可证的 HTTP 库.用 Python 编写,真正的为人类着想. Python 标准库中的 urllib2 模块提供了你所需要的大多数 H ...
- 批量下载小说网站上的小说(python爬虫)
随便说点什么 因为在学python,所有自然而然的就掉进了爬虫这个坑里,好吧,主要是因为我觉得爬虫比较酷,才入坑的. 想想看,你可以批量自动的采集互联网上海量的资料数据,是多么令人激动啊! 所以我就被 ...
- python 爬虫(二)
python 爬虫 Advanced HTML Parsing 1. 通过属性查找标签:基本上在每一个网站上都有stylesheets,针对于不同的标签会有不同的css类于之向对应在我们看到的标签可能 ...
- Python 爬虫1——爬虫简述
Python除了可以用来开发Python Web之后,其实还可以用来编写一些爬虫小工具,可能还有人不知道什么是爬虫的. 一.爬虫的定义: 爬虫——网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区 ...
- Python爬虫入门一之综述
大家好哈,最近博主在学习Python,学习期间也遇到一些问题,获得了一些经验,在此将自己的学习系统地整理下来,如果大家有兴趣学习爬虫的话,可以将这些文章作为参考,也欢迎大家一共分享学习经验. Pyth ...
- [python]爬虫学习(一)
要学习Python爬虫,我们要学习的共有以下几点(python2): Python基础知识 Python中urllib和urllib2库的用法 Python正则表达式 Python爬虫框架Scrapy ...
随机推荐
- 「luogu2387」[NOI2014] 魔法森林
「luogu2387」[NOI2014] 魔法森林 题目大意 \(n\) 个点 \(m\) 条边的无向图,每条边上有两个权值 \(a,b\),求从 \(1\) 节点到 \(n\) 节点 \(max\{ ...
- Abd学习笔记
Abd学习笔记 V快捷键:转正坐标 Tab快捷键:切换xyz或是长度角度 空格键快捷键:切换长度或弧度 Enter快捷键:确定方向x或y O快捷键:做辅助线 E:切换平面,分别有t,f,s Ra:创建 ...
- Java版InfluxDB工具类
InfluxDB工具类 package com.influxdb.test; import java.util.Map; import org.influxdb.InfluxDB; import or ...
- bounding box的简单理解
1. 小吐槽 OverFeat是我看的第一篇深度学习目标检测paper,因为它是第一次用深度学习来做定位.目标检测问题.可是,很难懂...那个bounding box写得也太简单了吧.虽然,很努力地想 ...
- fiddler限制网速
在测试过程中,经常会要求测试弱网络情况时的一些特殊情况,这时候IOS还好说,在开发者选项中调整网络模式即可,但android就只能通过别的方式了,这里整理了通过fiddler抓包工具来设置弱网模式,在 ...
- C语言中return 0和return 1和return -1
转载声明:本文系转载文章 原文作者:十一月zz 原文地址:https://blog.csdn.net/baidu_35679960/article/details/77542787 1.返回值int ...
- 十五丶IO model
事件驱动模型 上节的问题: 协程:遇到IO操作就切换. 但什么时候切回去呢?怎么确定IO操作完了? 很多程序员可能会考虑使用“线程池”或“连接池”.“线程池”旨在减少创建和销毁线程的频率,其维持一定合 ...
- 经验分享:PDF怎么提取页面
PDF文件的页面有很多但有需要的并不是全部,有时候需要其中一页或几页的时候,这个时候我们就需要把单独的页面提取出来,这个时候应该怎么做呢,上次有小伙伴来询问小编,今天小编就为大家分享一下小编自己的编辑 ...
- js 利用canvas + flv.js实现视频流 截屏 、本地下载功能实现,兼容火狐,谷歌;canvas截屏跨域问题,无音频视频流加载不显示问题
项目:物联网监控项目----后台视频流管理(前端实现视频截屏功能) 本文就不同视频源分情况展示: 1 本地视频(项目同目录视频)截屏(canvas.getContext("2d).drawI ...
- python3+Robot Framework+PyCharm第一个WEB UI自动化用例
这里只是列举一个很简单的例子,简单介绍工具的使用,编写用例之前,做好WEB UI自动化的准备工作,下载好chrome驱动(这里以chrome为例,不同浏览器有对应的驱动),注意驱动和浏览器版本要对应, ...