python的urlparse
‘壹’ 如何用python爬取搜索引擎的结果
我选取的是爬取网络知道的html 作为我的搜索源数据,目前先打算做网页标题的搜索,选用了 Python 的 scrapy 库来对网页进行爬取,爬取网页的标题,url,以及html,用sqlist3来对爬取的数据源进行管理。
爬取的过程是一个深度优先的过程,设定四个起始 url ,然后维护一个数据库,数据库中有两个表,一个 infoLib,其中存储了爬取的主要信息:标题,url ,html;另一个表为urlLib,存储已经爬取的url,是一个辅助表,在我们爬取每个网页前,需要先判断该网页是否已爬过(是否存在urlLib中)。在数据存储的过程中,使用了SQL的少量语法,由于我之前学过 MySQL ,这块处理起来比较驾轻就熟。
深度优先的网页爬取方案是:给定初始 url,爬取这个网页中所有 url,继续对网页中的 url 递归爬取。代码逐段解析在下面,方便自己以后回顾。
1.建一个 scrapy 工程:
关于建工程,可以参看这个scrapy入门教程,通过运行:
[python] view plain
scrapy startproject ***
在当前目录下建一个scrapy 的项目,然后在 spiders 的子目录下建立一个 .py文件,该文件即是爬虫的主要文件,注意:其中该文件的名字不能与该工程的名字相同,否则,之后调用跑这个爬虫的时候将会出现错误,见ImportError。
2.具体写.py文件:
[python] view plain
import scrapy
from scrapy import Request
import sqlite3
class rsSpider(scrapy.spiders.Spider): #该类继承自 scrapy 中的 spider
name = "" #将该爬虫命名为 “知道”,在执行爬虫时对应指令将为: scrapy crawl
#download_delay = 1 #只是用于控制爬虫速度的,1s/次,可以用来对付反爬虫
allowed_domains = ["..com"] #允许爬取的作用域
url_first = 'http://..com/question/' #用于之后解析域名用的短字符串
start_urls = ["http://..com/question/647795152324593805.html", #python
"http://..com/question/23976256.html", #database
"http://..com/question/336615223.html", #C++
"http://..com/question/251232779.html", #operator system
"http://..com/question/137965104.html" #Unix programing
] #定义初始的 url ,有五类知道起始网页
#add database
connDataBase = sqlite3.connect(".db") #连接到数据库“.db”
cDataBase = connDataBase.cursor() #设置定位指针
cDataBase.execute('''''CREATE TABLE IF NOT EXISTS infoLib
(id INTEGER PRIMARY KEY AUTOINCREMENT,name text,url text,html text)''')
#通过定位指针操作数据库,若.db中 infoLib表不存在,则建立该表,其中主键是自增的 id(用于引擎的docId),下一列是文章的标题,然后是url,最后是html
#url dataBase
cDataBase.execute('''''CREATE TABLE IF NOT EXISTS urlLib
(url text PRIMARY KEY)''')
#通过定位指针操作数据库,若.db中urlLib表不存在,则建立该表,其中只存了 url,保存已经爬过的url,之所以再建一个表,是猜测表的主键应该使用哈希表存储的,查询速度较快,此处其实也可以用一个外键将两个表关联起来
2. .py文件中的parse函数:
.py文件中的parse函数将具体处理url返回的 response,进行解析,具体代码中说明:
[python] view plain
def parse(self,response):
pageName = response.xpath('//title/text()').extract()[0] #解析爬取网页中的名称
pageUrl = response.xpath("//head/link").re('href="(.*?)"')[0] #解析爬取网页的 url,并不是直接使用函数获取,那样会夹杂乱码
pageHtml = response.xpath("//html").extract()[0] #获取网页html
# judge whether pageUrl in cUrl
if pageUrl in self.start_urls:
#若当前url 是 start_url 中以一员。进行该判断的原因是,我们对重复的 start_url 中的网址将仍然进行爬取,而对非 start_url 中的曾经爬过的网页将不再爬取
self.cDataBase.execute('SELECT * FROM urlLib WHERE url = (?)',(pageUrl,))
lines = self.cDataBase.fetchall()
if len(lines): #若当前Url已经爬过
pass #则不再在数据库中添加信息,只是由其为跟继续往下爬
else: #否则,将信息爬入数据库
self.cDataBase.execute('INSERT INTO urlLib (url) VALUES (?)',(pageUrl,))
self.cDataBase.execute("INSERT INTO infoLib (name,url,html) VALUES (?,?,?)",(pageName,pageUrl,pageHtml))
else: #此时进入的非 url 网页一定是没有爬取过的(因为深入start_url之后的网页都会先进行判断,在爬取,在下面的for循环中判断)
self.cDataBase.execute('INSERT INTO urlLib (url) VALUES (?)',(pageUrl,))
self.cDataBase.execute("INSERT INTO infoLib (name,url,html) VALUES (?,?,?)",(pageName,pageUrl,pageHtml))
self.connDataBase.commit() #保存数据库的更新
print "-----------------------------------------------" #输出提示信息,没啥用
for sel in response.xpath('//ul/li/a').re('href="(/question/.*?.html)'): #抓出所有该网页的延伸网页,进行判断并对未爬过的网页进行爬取
sel = "http://..com" + sel #解析出延伸网页的url
self.cDataBase.execute('SELECT * FROM urlLib WHERE url = (?)',(sel,)) #判断该网页是否已在数据库中
lines = self.cDataBase.fetchall()
if len(lines) == 0: #若不在,则对其继续进行爬取
yield Request(url = sel, callback=self.parse)
‘贰’ python 中关于用beautifulsoup4库解析网页源代码标签的问题,急求解答
以网络为例
#-*-coding:utf-8-*-
importrequests
importurlparse
importos
frombs4importBeautifulSoup
defprocess(url):
headers={'content-type':'application/json',
'User-Agent':'Mozilla/5.0(X11;Ubuntu;Linuxx86_64;rv:22.0)Gecko/20100101Firefox/22.0'}
pageSourse=requests.get(url,headers=headers).text
page_soup=BeautifulSoup(pageSourse)
a_all=page_soup.findAll("a")
link_urls=[i.get('href')foriina_all]#有些是javascript触发事件,过滤方法自己写下。
img_all=page_soup.findAll("img")
img_urls=[i.get("src")foriinimg_all]
printlink_urls,img_urls
return(link_urls,img_urls)
process("https://www..com")
结果如下:
[u'/',u'javascript:;',u'javascript:;',u'javascript:;',u'/',u'javascript:;',u'https://passport..com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww..com%2F',u'http://www.nuomi.com/?cid=002540',u'http://news..com',u'http://www.hao123.com',u'http://map..com',u'http://v..com',u'http://tieba..com',u'https://passport..com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww..com%2F',u'http://www..com/gaoji/preferences.html',u'http://www..com/more/',u'http://news..com/ns?cl=2&rn=20&tn=news&word=',u'http://tieba..com/f?kw=&fr=wwwt',u'http://..com/q?ct=17&pn=0&tn=ikaslist&rn=10&word=&fr=wwwt',u'http://music..com/search?fr=ps&ie=utf-8&key=',u'http://image..com/search/index?tn=image&ps=1&ct=201326592&lm=-1&cl=2&nc=1&ie=utf-8&word=',u'http://v..com/v?ct=301989888&rn=20&pn=0&db=0&s=25&ie=utf-8&word=',u'http://map..com/m?word=&fr=ps01000',u'http://wenku..com/search?word=&lm=0&od=0&ie=utf-8',u'//www..com/more/',u'/',u'//www..com/cache/sethelp/help.html',u'http://home..com',u'http://ir..com',u'http://www..com/ty/',u'http://jianyi..com/'][u'//www..com/img/bd_logo1.png',u'//www..com/img/_jgylogo3.gif']
有问题可指出,满意请采纳
‘叁’ python3中为什么urlparse.urljoin没有了
python3对urllib和urllib2进行了重构,拆分成了urllib.request, urllib.response, urllib.parse, urllib.error等几个子模块,这样的架构从逻辑和结构上说更加合理。
urljoin现在对应的函数是urllib.parse.urljoin
‘肆’ python爬虫的工作步骤
当前处于一个大数据的时代,一般网站数据来源有二:网站用户自身产生的数据和网站从其他来源获取的数据,今天要分享的是如何从其他网站获取你想要的数据。
目前最适合用于写爬虫的语言是python,python中最受欢迎的爬虫框架是scrapy,本文围绕scrapy来展开讲解爬虫是怎么工作的。
1.如下图所示,爬虫从编写的spider文件中的start_urls开始,这个列表中的url就是爬虫抓取的第一个网页,它的返回值是该url对应网页的源代码,我们可以用默认的parse(self,response)函数去打印或解析这个源代码
2.我们获取到源代码之后,就可以从网页源代码中找到我们想要的信息或需要进一步访问的url,提取信息这一步,scrapy中集成了xpath,正则(re),功能十分强大,提取到信息之后会通过yield进入到中间件当中。
中间件包括爬虫中间件和下载中间件,爬虫中间件主要用于设置处理爬虫文件中的代码块,下载中间件主要用于判断爬虫进入网页前后的爬取状态,在此中间件中,你可以根据爬虫的返回状态去做进一步判断。
最后我们将yield过来的item,即就是我们想要的数据会在pipeline.py文件中进行处理,存入数据库,写入本地文件,都可以在这里进行,另外,为了减少代码冗余,建议所有与设置参数有关的参数,都写在settings.py中去
‘伍’ Python3 如何对url解码实现Python2中urllib.unquote的作用
url编码:
import urllib
url = 'http://test.com/s?wd=哈哈' #如果此网站编码是gbk的话,需要进行解码,从gbk解码成unicode,再从Unicode编码编码为utf-8格式。
url = url.decode('gbk', 'replace')
print urllib.quote(url.encode('utf-8', 'replace'))
‘陆’ Python有包可以合并两个url吗就是将两个url整合成为一个,不同的应用扫描访问不同的url
from urllib import parse
parse.join()可以合并URL