Python 网页爬虫

一、要解决的问题

需要解决的是根据自定义的关键词自动搜索google学术,解析搜索到的网页,下载所有相应的论文的PDF链接。这里我们采用Python来实现,

二、Python入门

python 自动缩进:shift+table整块向左缩进,table向右缩进,在修改整块代码时很有用比如将函数变成单独执行时。

了解python的变量,包,函数定义等

三、网页知识

3.1 浏览网页的过程

打开网页的过程其实就是浏览器作为一个浏览的“客户端”,向服务器端发送了 一次请求,把服务器端的文件“抓”到本地,再进行解释、展现。

HTML是一种标记语言,用标签标记内容并加以解析和区分。

浏览器的功能是将获取到的HTML代码进行解析,然后将原始的代码转变成我们直接看到的网站页面。

3.2 URI和URL的概念

简单的来讲,URL就是在浏览器端输入的    http://www.baidu.com    这个字符串。

在理解URL之前,首先要理解URI的概念。

URL是URI的一个子集。它是Uniform Resource Locator的缩写,译为“统一资源定位 符”。

通俗地说,URL是Internet上描述信息资源的字符串,主要用在各种WWW客户程序和服务器程序上。

采用URL可以用一种统一的格式来描述各种信息资源,包括文件、服务器的地址和目录等。

URL的一般格式为(带方括号[]的为可选项):

protocol :// hostname[:port] / path / [;parameters][?query]#fragment

URL的格式由三部分组成:

①第一部分是协议(或称为服务方式)。

②第二部分是存有该资源的主机IP地址(有时也包括端口号)。

③第三部分是主机资源的具体地址,如目录和文件名等。

第一部分和第二部分用“://”符号隔开,

第二部分和第三部分用“/”符号隔开。

第一部分和第二部分是不可缺少的,第三部分有时可以省略。

参考至:http://blog.csdn.net/pleasecallmewhy/article/details/8922826

四、网页爬虫

4.1 解决google无法登陆

因为要抓取的google学术的页面,但是google在中国屏蔽了,所以需要在电脑上先配置好goagent,然后进行代理配置,代码如下



proxy = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087","https":"https://127.0.0.1:8087"})

opener = urllib2.build_opener(proxy)

urllib2.install_opener(opener)


4.2 解决抓取屏蔽

对于少量的查询,但如果要进行上千上万次的查询,上面的方法就不再有效了, Google会检测你请求的来源,如果我们利用机器频繁爬取Google的搜索结果,不多久就Google会block你的IP,并给你返回503 Error页面。可以设置URL请求的headers,  伪装我们的user agent。简单的说,user agent就是客户端浏览器等应用程序使用的一种特殊的网络协议, 在每次浏览器(邮件客户端/搜索引擎蜘蛛)进行 HTTP 请求时发送到服务器,服务器就知道了用户是使用什么浏览器(邮件客户端/搜索引擎蜘蛛)来访问的。 有时候为了达到一些目的,我们不得不去善意的欺骗服务器告诉它我不是在用机器访问你。



user_agents = [‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0‘, \

‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0‘, \

‘Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \

(KHTML, like Gecko) Element Browser 5.0‘, \

‘IBM WebExplorer /v0.94‘, ‘Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)‘, \

‘Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)‘, \

‘Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14‘, \

‘Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \

Version/6.0 Mobile/10A5355d Safari/8536.25‘, \

‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \

Chrome/28.0.1468.0 Safari/537.36‘, \

‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)‘]

proxy = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087","https":"https://127.0.0.1:8087"})

opener = urllib2.build_opener(proxy)

urllib2.install_opener(opener)


4.3 正则表达式解析网页

使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。比如:现在的需求是要找到一个正则表达式来匹配后缀是“.pdf”的字符串。



inputURL = ‘http://scholar.google.com/scholar?q=text+detection&btnG=&hl=en&as_sdt=0%2C5‘

request = urllib2.Request(inputURL)

index = random.randint(0, 9)

user_agent = user_agents[index]

request.add_header(‘User-agent‘, user_agent)

f = urllib2.urlopen(request).read() #打开网页

print f

localDir = ‘E:\download\\‘ #下载PDF文件需要存储在本地的文件夹

urlList = [] #用来存储提取的PDF下载的url的列表

for eachLine in f: #遍历网页的每一行

line = eachLine.strip() #去除行首位的空格,习惯性写法

if re.match(‘.*PDF.*‘, line): #去匹配含有“PDF”字符串的行,只有这些行才有PDF下载地址

wordList = line.split(‘\"‘) #以"为分界,将该行分开,这样就将url地址单独分开了

for word in wordList: #遍历每个字符串

if re.match(‘.*\.pdf$‘, word): #去匹配含有“.pdf”的字符串,只有url中才有

urlList.append(word) #将提取的url存入列表

for everyURL in urlList: #遍历列表的每一项,即每一个PDF的url

wordItems = everyURL.split(‘/‘) #将url以/为界进行划分,为了提取该PDF文件名

for item in wordItems: #遍历每个字符串

if re.match(‘.*\.pdf$‘, item): #查找PDF的文件名

PDFName = item #查找到PDF文件名

localPDF = localDir + PDFName #将本地存储目录和需要提取的PDF文件名进行连接

try:

urllib.urlretrieve(everyURL, localPDF) #按照url进行下载,并以其文件名存储到本地目录

except Exception, e:

continue


五、遇到的问题及解决

5.1 采用http协议

打开google的时候,如果用https协议无法打开网页取到内容,只有采用http协议才可以,原因可能是https采用加密协议。



# -*- coding: utf-8 -*-

"""

Created on Fri Feb 13 16:27:02 2015

@author: dwanminghuang

"""

import urllib #导入urllib模块

import urllib2 #导入urllib2模块

import re

import re, random, types #导入正则表达式模块:re模块

user_agents = [‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20130406 Firefox/23.0‘, \

‘Mozilla/5.0 (Windows NT 6.1; WOW64; rv:18.0) Gecko/20100101 Firefox/18.0‘, \

‘Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533+ \

(KHTML, like Gecko) Element Browser 5.0‘, \

‘IBM WebExplorer /v0.94‘, ‘Galaxy/1.0 [en] (Mac OS X 10.5.6; U; en)‘, \

‘Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; WOW64; Trident/6.0)‘, \

‘Opera/9.80 (Windows NT 6.0) Presto/2.12.388 Version/12.14‘, \

‘Mozilla/5.0 (iPad; CPU OS 6_0 like Mac OS X) AppleWebKit/536.26 (KHTML, like Gecko) \

Version/6.0 Mobile/10A5355d Safari/8536.25‘, \

‘Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) \

Chrome/28.0.1468.0 Safari/537.36‘, \

‘Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/5.0; TheWorld)‘]

proxy = urllib2.ProxyHandler({"http":"http://127.0.0.1:8087","https":"https://127.0.0.1:8087"})

opener = urllib2.build_opener(proxy)

urllib2.install_opener(opener)

inputURL = ‘http://scholar.google.com/scholar?q=text+detection&btnG=&hl=en&as_sdt=0%2C5‘

request = urllib2.Request(inputURL)

index = random.randint(0, 9)

user_agent = user_agents[index]

request.add_header(‘User-agent‘, user_agent)

f = urllib2.urlopen(request).read() #打开网页

print f

localDir = ‘E:\download\\‘ #下载PDF文件需要存储在本地的文件夹

urlList = [] #用来存储提取的PDF下载的url的列表

for eachLine in f: #遍历网页的每一行

line = eachLine.strip() #去除行首位的空格,习惯性写法

if re.match(‘.*PDF.*‘, line): #去匹配含有“PDF”字符串的行,只有这些行才有PDF下载地址

wordList = line.split(‘\"‘) #以"为分界,将该行分开,这样就将url地址单独分开了

for word in wordList: #遍历每个字符串

if re.match(‘.*\.pdf$‘, word): #去匹配含有“.pdf”的字符串,只有url中才有

urlList.append(word) #将提取的url存入列表

for everyURL in urlList: #遍历列表的每一项,即每一个PDF的url

wordItems = everyURL.split(‘/‘) #将url以/为界进行划分,为了提取该PDF文件名

for item in wordItems: #遍历每个字符串

if re.match(‘.*\.pdf$‘, item): #查找PDF的文件名

PDFName = item #查找到PDF文件名

localPDF = localDir + PDFName #将本地存储目录和需要提取的PDF文件名进行连接

try:

urllib.urlretrieve(everyURL, localPDF) #按照url进行下载,并以其文件名存储到本地目录

except Exception, e:

continue



Python 网页爬虫

时间: 2024-10-13 11:21:41

Python 网页爬虫的相关文章

Python天气预报采集器 python网页爬虫

这个天气预报采集是从中国天气网提取广东省内主要城市的天气并回显.本来是打算采集腾讯天气的,但是貌似它的数据是用js写上去还是什么的,得到的html文本中不包含数据,所以就算了 爬虫简单说来包括两个步骤:获得网页文本.过滤得到数据. 1.获得html文本.  python在获取html方面十分方便,寥寥数行代码就可以实现需要的功能. def getHtml(url): page = urllib.urlopen(url) html = page.read() page.close() return

Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱(转)

原文:http://www.52nlp.cn/python-网页爬虫-文本处理-科学计算-机器学习-数据挖掘 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python.离开腾讯创业后,第一个作品课程图谱也是选择了Python系的Flask框架,渐渐的将自己的绝大部分工作交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处理,科学计算,机器学习和数据挖掘领域,有很多很多

【Python】Python 网页爬虫 & 文本处理 & 科学计算 & 机器学习 & 数据挖掘兵器谱

好文 mark http://www.52nlp.cn/python-%E7%BD%91%E9%A1%B5%E7%88%AC%E8%99%AB-%E6%96%87%E6%9C%AC%E5%A4%84%E7%90%86-%E7%A7%91%E5%AD%A6%E8%AE%A1%E7%AE%97-%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0-%E6%95%B0%E6%8D%AE%E6%8C%96%E6%8E%98 曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工

python网页爬虫浅析

Python网页爬虫简介: 有时候我们需要把一个网页的图片copy 下来.通常手工的方式是鼠标右键 save picture as ... python 网页爬虫可以一次性把所有图片copy 下来. 步骤如下: 1. 读取要爬虫的html 2. 对爬下来的html 进行存储并处理: 存储原始html 过滤生成list 正则匹配出picture的连接 3. 根据连接保存图片到本地 主要的难点: 熟悉urllib , 正则匹配查找图片链接 代码如下: import urllib.request im

Python网页爬虫学习

我总结的了ython网页爬虫的笔记,使用BeautifulSoup和requests两个模块实现,能够爬取百度贴吧帖子图片的功能.里面还包括的了两个模块具体的使用讲解,还包含了详细的注释.有问题请在GIT留言或者邮箱联系 可以直接去Github下载: 下载地址: https://github.com/liangz0707/WebCrawler git地址:[email protected]:liangz0707/WebCrawler.git

python网页爬虫

以前也接触过爬虫方面的知识,但是总体感觉写爬虫的话,最好使用python,因为python有很多数据采集方面的库, 此外python这面语言使用起来比较简洁易读,在采集的过程中,维护起来也比较方便! 首先来几个简单的数据采集: import requests req=requests.get("http://www.baidu.com") print req.content 这个相当于简单的http的get 请求! import urllib req=urllib.urlopen(&q

python网页爬虫小项目开发

这是我最近接的一个小项目,花了是整整四天多时间,最终老师也很好,给了两千块的报酬. 任务是将http://www.examcoo.com/index/detail/mid/7网站下所有的试卷里的试题全部提取出来,首先按照题型进行分类,接着分析出题目的类型 类别 来源 出题时间等等信息,最终将这些信息转化到excel表格中,excel中的数据有着统一的格式.其中有些信息有关医学,故而需要自行了解. 由于仅仅是是为了完成最终的任务,故而没有使用什么爬虫框架之类的,也没有使用什么数据库来保存数据,尽量

python网页爬虫--京东家电版块

双十二就要到了,浏览京东商城也浏览的比较多,突然想到写一个爬虫来爬取一些“京东家电”的数据,可能会对双十二的活动有点预见性,也挺好玩的. 1.选定爬取的模块  京东商城--京东家电--家用电器--大家电 2.爬取“平板电视”这一模块的数据 我用的是火狐浏览器的HttpFox插件来查看网页的加载信息.当进入“平板电视”这一模块的时候,网页的加载信息是这样的: 打开第一个“GET”进来的网页信息,然后查看该加载的网页的“Header”信息,发现该网页是重新加载的,从“Referer”可看出该网页的新

python网页爬虫开发之六-Selenium使用

chromedriver禁用图片,禁用js,切换UA selenium 模拟chrome浏览器,此时就是一个真实的浏览器,一个浏览器该加载的该渲染的它都加载都渲染,所以爬取网页的速度很慢.如果可以不加载图片等操作,网页加载速度就会快不少,代码中列出了了禁用图片,禁用JS,切换UA的方法. from selenium import webdriver from fake_useragent import UserAgent ua = UserAgent().random print(ua) chr