c爬虫抓取网页数据(跳出细节信息,只有极少数是自己关心的(组图))
优采云 发布时间: 2022-01-26 11:02c爬虫抓取网页数据(跳出细节信息,只有极少数是自己关心的(组图))
使用的包主要有:
Requests 具有良好的树状分析特性,可以省去正则表达式带来的麻烦。打算学习urllib,熟悉爬虫的一般特性。如果加载成功,则说明对应的包已经安装完毕。
C-程序管理
运行—>配置,设置.py文件的存放路径:
三、页面爬取(以下基于python2.7,3.5类似)
跳出细节,先想想爬取需要哪些操作:
第一步:爬取页面信息
打开一个网页的过程可以简化为:HTTP是用户发出的请求—>对方返回协议—>页面被解析显示。
对于景观 网站,使用基本的 python 爬取代码:
import urllib2
def download(url):
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
request = urllib2.Request(url,headers = headers)
try:
html = urllib2.urlopen(request).read()
except urllib2.URLError as e:
print 'error:', e.reason
html = None
return html
url = 'http://www.onlytease.com/'
page = download(url)
print page
关于解码信息,打开网页按F12,可以在头部下拉列表中看到编码方式,解码与之对应。
至此,已经实现了基础网页的爬取功能。然而,只有少数整页关注自己。基础框架的搭建只剩下一个问题:如何爬取你想要的内容。
第二步:定位目标信息
打开任意网页(以chrome为例),选择感兴趣的内容,右键:勾选(或快捷键:Crtl + shift + I),即可查看对应详情:
例如选择一张图片:
查看电脑User-agent的方式有很多种,可以直接登录网站。
这是人类观察的一种方式。如果要自动定位目标信息,可以使用正则表达式、beautifulsoup等工具。请参阅此 文章 以了解常见的正则表达式。
第三步:编写目标内容
抛开前两步,以图片为例,大家可以在网上搜索python网页图片下载。看具体操作,文本/压缩文件等。
url = 'http://pics.sc.chinaz.com/files/pic/pic9/201705/bpic1322.jpg'
f = open('1.jpg',"wb") #命名并打开文件
req = urllib2.urlopen(url)
buf = req.read() #读出文件
f.write(buf) #写入文件
这样,网上的图片进入本地:
爬取小图:
代码:
import urllib2
import re
def download(url): #Step1:读取网页内容
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
request = urllib2.Request(url,headers = headers)
try:
html = urllib2.urlopen(request).read()
except urllib2.URLError as e:
print 'error:', e.reason
html = None
return html
#Step2:获取目标信息链接,我要的是jpg的链接
url = 'http://sc.chinaz.com/tupian/fengjingtupian.html'
page = download(url)
imglist = re.findall('src2="(.*?)"',page) #re.findall() 方法读取html 中包含 imgre(正则表达式)的 数据
#Step3:文件保存至本地
i = 1
for imgname in imglist:
f = open('.\\sightsee\\'+str(i)+'.jpg',"wb") #命名并打开文件
print i
i = i+1
req = urllib2.urlopen(imgname)
buf = req.read() #读出文件
f.write(buf) #写入文件
在包里:
为什么是src2而不是src,把下载的文本复制到txt文件,搜索.jpg,
我看到是src2,但是网页是src:
以上爬取的是一页图片。如果你想得到总数怎么办?您可以通过正则表达式匹配和计算总页数。看看它:
打开网站,一共找到2217页:
除了第一页有点不同:
其他人跟随等等:
好的,现在进一步改进代码:
import urllib2
import re
import numpy as np
def download(url): #Step1:读取网页内容
headers = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
request = urllib2.Request(url,headers = headers)
try:
html = urllib2.urlopen(request).read()
except urllib2.URLError as e:
print 'error:', e.reason
html = None
return html
urllen = 2217
tag = np.arange(1,urllen+1)
base = 'http://sc.chinaz.com/tupian/'
i = 1
for j in tag:
if j==1:
url = base+'index.html'
else:
url = base+'index_'+str(j)+'.html'
page = download(url)
imglist = re.findall('src2="(.*?)"',page) #re.findall() 方法读取html的.jpg链接
for imgname in imglist:
f = open('.\\sightsee\\'+str(i)+'.jpg',"wb") #命名并打开文件
print i
i = i+1
req = urllib2.urlopen(imgname)
buf = req.read() #读出文件
f.write(buf) #写入文件
f.close()
已成功下载:
有一个问题:
未设置超时参数。结果,当网络环境不好的时候,经常会出现read()方法没有响应的问题。程序卡在 read() 方法中。为 urlopen 添加超时是可以的。设置 timeout 后超时后,会在读取超时时抛出 socket.timeout 异常。如果希望程序稳定,需要在urlopen中加入异常处理,出现异常时重试。
修改这句话:
html = urllib2.urlopen(request,timeout=2).read()
问题解决了。
但是还有其他错误:
参考下图,添加异常处理,问题解决。
四、渲染动态网页抓取
python工具包可以在这里下载。安装selenium工具包,安装好,在python2中单独下载:cssselect,顾名思义,css+select就是第一个css样式选择。
这里只记录应用,偷懒:使用selenium+phantomjs的爬取方式。
phantomjs简介:
PhantomJS 是一个基于 WebKit 的服务器端 JavaScript API。它完全支持没有浏览器支持的 Web,并且速度很快并且原生支持各种 Web 标准:DOM 操作、CSS 选择器、JSON、Canvas 和 SVG。PhantomJS 可用于页面自动化、网络监控、网页截图和 UI 测试。
很多网页不会一次加载全部内容,如果每次都刷新页面也不理想,所以借助动态加载,可以看到只有这部分内容加载到了哪里。Phantomjs可以在不打开浏览器的情况下获取加载后的网页内容,这样可以通过urllib2.请求操作读取网页的全部内容,而不是动态加载的内容.
注意两点:
1-phantomjs的\bin需要在环境变量PATH中添加绝对路径;
2-在代码中:在路径前添加 r
browser = webdriver.PhantomJS(executable_path=r"C:\Users\Nobleding\Anaconda3\Lib\site-packages\phantomjs-2.1.1-windows\bin\phantomjs.exe")
#coding=utf-8
from selenium import webdriver
import re
import urllib2
browser = webdriver.PhantomJS(executable_path=r"C:\Users\Nobleding\Anaconda3\Lib\site-packages\phantomjs-2.1.1-windows\bin\phantomjs.exe")
browser.implicitly_wait(50)
#browser.get("https://www.baidu.com/")
urllink = "网址名称"
browser.get(urllink)
page = browser.execute_script("return document.documentElement.outerHTML")
imglist = re.findall('src=(.*?).jpg', page) #re.findall() 方法读取html的.jpg链接
i=1
for imgname in imglist:
f = open('.\\sightsee\\'+str(i)+'.jpg',"wb") #命名并打开文件
print i
i = i+1
try:
imglink = imgname+'.jpg'
n = len(imglink)
req = urllib2.urlopen(imglink[1:n],timeout = 3)
except urllib2.URLError, e:
print 'error:', e.reason
continue
except socket.error as e:
continue
except socket.timeout as e:
continue
except urllib2.HTTPError:
continue
buf = req.read() #读出文件
f.write(buf) #写入文件
f.close()
基于urllib2/urllib3/urllib,经常报超时错误。直接使用requests更直接,不再报超时错误:
<p># -*- coding: utf-8 -*-
"""
Created on Sun May 07 09:48:39 2017
@author: Nobleding
"""
import requests
import re
import socket
import numpy as np
import urllib
from socket import timeout
def download(url): #Step1:读取网页内容
header = {'User-Agent':"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1"}
# request = requests.Request(url,headers = headers)
try:
htmll = requests.get(url,headers=header)
html = htmll.text
# except requests.URLError:
# print ('error:')
# html = None
except socket.error as e:
html = None
except socket.timeout as e:
html = None
except urllib.request.HTTPError:
html = None
return html
urlmain =网址
pagemain = download(urlmain)
#pagemain = pagemain.decode('utf-8')
imglistmain = re.findall('