公司有需要,需要抓取某些网页,自然就想到了简单易用的python。
说是简单易用,但是对于没有接触过python的我还是很吃力的,一边查资料一边写代码,终于写完了,写个博客记录一下
用到的库主要有urllib,etree
使用urllib抓取网页,具体代码为
from urllib import request
def getcontent(url):
content = ''
headers = get_headers()
res = request.Request(url, headers=headers)
try:
resp = request.urlopen(res, timeout=30)
content = resp.read().decode('utf-8')
except Exception as e:
print('exception: %s' % e)
time.sleep(2)
spider(url)
return content
#获取请求头信息
def get_headers():
"""
返回请求头信息
:return:
"""
headers = {
'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
"AppleWebKit/537.36 (KHTML, like Gecko) "
"Chrome/65.0.3325.181 Safari/537.36"
}
return headers
注意下面的get_headers(),这个是防止某些网站屏蔽爬虫的
使用etree解析获取到的html
具体方法如下
from lxml import etree
def gettable(content):
html = bytes(bytearray(content, encoding='utf-8'))
html = etree.HTML(html)
tablestr = "<table>"
try:
info = html.xpath("//table//tr")
for text in info:
tablestr = tablestr + "<tr>"
tdtext = text.xpath("./td")
atext = tdtext[0].xpath("./p/a/@href")
acontent = tdtext[0].xpath("./p/a/text()")
if(len(atext)>0):
updatetext = ""
datetext = tdtext[1].xpath('./p/text()')
if len(datetext) > 0:
updatetext = datetext[0]
else:
datetext = tdtext[1].xpath('.//span/text()')
if len(datetext) > 0:
updatetext = datetext[0]
#判断是否有链接,如果没有链接则这里也不加链接
tablestr = tablestr + "<td><a href=\"file/"+ acontent[0].replace("/","") +".pdf\" target=\"_blank\">" + acontent[0] + "</a></td><td>" + updatetext + "</td>"
tablestr = tablestr + "</tr>"
tablestr = tablestr + "</table>"
except Exception as e:
print('解析异常: %s' % e)
return tablestr
由于我需要的信息是里面的表格,而且需要对表格里面的数据进行更改,所以比较复杂,不弱不需要可以适当删除,核心就是使用xpath选择所需要的文本。
我要抓取的信息还需要下载文件,下载文件的代码如下
from urllib import request
def downloadpdf(url,path):
try:
#path = r"C:\Users\cam\Desktop\zhj\file"+"\\"+name+".pdf"
opener = request.build_opener()
opener.addheaders = ([("User-Agent","Chrome/65.0.3325.181 Safari/537.36")])
request.install_opener(opener)
request.urlretrieve(url, path)
except Exception as e:
print('解析异常: %s' % e)
time.sleep(2)
downloadpdf(url,path)