c爬虫抓取网页数据(跳出细节信息,只有极少数是自己关心的(组图))

优采云 发布时间: 2022-01-26 11:02

  c爬虫抓取网页数据(跳出细节信息,只有极少数是自己关心的(组图))

  使用的包主要有:

  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('

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线