这个是目标网站:http://www.liyang.gov.cn/default.php?mod=article&do=detail&tid=146308363&sid=
然后附件下不下来,也没有报错
以下是源码
‘’‘
import requests
import re
import os
from lxml.etree import HTML
def request_link(link):
"""链接请求"""
headers_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.89 Safari/537.36'}
request = requests.get(link, headers=headers_dict, allow_redirects=True, verify=True) # 提交网址
if 200 <= request.status_code <= 206: # 判断响应状态码
htmlData = request.text.encode('utf-8').decode('utf-8')
return htmlData
else:
return None
def extract_fields(pattern, datas, flags, m=1):
"""提取字段"""
findField = re.search(pattern, datas, flags=flags)
if findField:
findField = findField.group(1)
if m:
if '<' in findField:
findField = re.sub('<(.*?)>', '', findField, flags=re.S)
return findField.replace(' ', '')
else:
return findField
else:
return 'null'
def download(fileName, url, path):
"""下载附件"""
try:
print('下载中,请耐心等待...')
r = requests.get(url)
with open(path + fileName, "wb") as File:
File.write(r.content)
print(fileName, '下载Ok')
except:
print(fileName, '下载失败')
def main():
for i in range(98): # 循环迭代列表翻页
if not i: # 判断第一页
url = 'http://www.liyang.gov.cn/default.php?mod=article&fid=163250&s99679207_start=0'
else: # 其它列表页
url = 'http://www.liyang.gov.cn/default.php?mod=article&fid=163250&s99679207_start=+i'
print('\n正在提取列表第%s页item的详情链接...\n' % str(i + 1))
data = request_link(url) # 列表页面的链接请求
if data:
# print(len(data))
tree = HTML(data) # 列表页面
urlList = tree.xpath('//span[@class="link_14"]/a') # 匹配列表页面的item的详情链接
if urlList:
print('列表第%s页共计条目:' % str(i + 1), len(urlList))
v = 1
for url in urlList:
url_i = 'http://www.liyang.gov.cn/'+ url.get('href')
print(url_i)
try:
print(v, '正在提取链接:', url_i, '的字段数据...')
datas = request_link(url_i) # 详情页面的链接请求
print(len(datas))
if datas:
trees = HTML(datas) # 详情页面
title = trees.xpath('//font[@class="link_19"]/text()') # 匹配标题
if title:
title = title[0]
# print(title)
date = trees.xpath('//*[@id="s80804844_content"]/div[1]/table/tbody/tr/td/font[2]/font/text()')[0].split()[0]# 发布日期
print(date)
path = './data/%s/' %title
try:
os.mkdir(path) # 创建储存数据和附件的目录
except:
pass
content = extract_fields(r'<font class="link_19">(.*?)</font>', datas,re.S) # 公示文本纯内容
content = content.replace(' ', '').replace(' ', '').replace('“', '')
# print(content)
contents = extract_fields(r'<div class="xh-highlight">(.*?)</div>', datas,re.S, 0) # 公示文本div
# print(contents)
if '<img' in contents: # 判断图片
imgUrls = re.findall(r'src="(.*?)"', contents, 0)
for imgUrl in imgUrls:
imgUrl = 'http://www.liyang.gov.cn/' + imgUrl
print(imgUrl)
download(imgUrl.split('/')[-1], imgUrl, path) # 下载图片
if '<a' in contents: # 判断附件
fileUrls = re.findall(r'href="(.*?)"', contents, 0)
for fileUrl in fileUrls:
fileUrl = 'http://www.liyang.gov.cn/' + fileUrl
print(fileUrl)
download(fileUrl.split('/')[-1], fileUrl, path) # 下载附件
with open(path + 'data.txt', 'w', encoding='utf-8') as f: # 储存页面源代码及数据内容
f.write(title + '\n\n' + date + ' ' + '溧阳环保' + '\n\n' + content)
except:
print('响应或解析异常!!')
pass
v += 1
if name == 'main':
main()
’‘’
还是你,方法是死的人是活的,首先你要是对单个网页爬取内容,直接F12找目标'http://www.liyang.gov.cn/files/100898/1907/2160_57311303b7.pdf'这个就是啦
import requests
re =requests.get('http://www.liyang.gov.cn/files/100898/1907/2160_57311303b7.pdf')
data =re.content
with open('11.pdf','wb') as fw:
(缩进)fw.write(data)
就这么简单...........
批量爬取呢也很简单啦,我明天要考试没法帮你弄啦,保存文件就这样,明天晚上有空帮你写吧,政府网站一般很捞不需要什么进阶技巧
你上面的headers=headers_dict, allow_redirects=True, verify=True,完全没必要加进去真的
看我博客爬虫分类,先看基础再爬取,我后续会慢慢补全博客的
我的博客https://www.cnblogs.com/pythonywy/,有问题可以私信我
好的!最近在恶补知识没有注意博客回复
@扶荔: 我帮你重新写一个好了,到时候私信你好了,这个很简单的不会超过50行
@小小咸鱼YwY: 好的,我去研读一下! 谢谢大佬
@小小咸鱼YwY: 大佬,url中间有个点,要用切片切掉,这种切中间的应该怎么写呀
@扶荔: 不要叫大佬啦,那个切片不实用吧一般用re
@小小咸鱼YwY: url_i = 'http://hbj.zhenjiang.gov.cn/zwgk/xmspys/hpwjsp/sqkgs' + url.get('href')。我是这么拼接的,href="./201904/t20190429_2138304.htm" href前面有个点,这个能用正则吗
@扶荔: 这种呀用切片就是后半段url[1:]
@小小咸鱼YwY: 对的,我在找在哪切
@扶荔: 就是在拼接前,后半部分有点的url,url[:1]别复杂化,先切后拼接,不要先拼接后切,先拼接用re会快一点
@小小咸鱼YwY: 好的
@小小咸鱼YwY: 我琢磨了半天发现在url.get('href')后面加个[1:]就可以了....
@扶荔: 我写太快了尴尬了写反了,https://www.cnblogs.com/pythonywy/p/10827528.html你看这个,我总结的切片工具用法你看看
@扶荔: 你发的消息好像被我QQ邮箱当垃圾邮件屏蔽了没看到
@扶荔: 切片工具其实有3个参数[参数1:参数2:切的方向],参数1为切的头,参数2为切的尾,切片工具顾头不顾尾,所有[1:]其实是第二个开始算起,参数2不填默认到最后,不好意思写快了没写清楚,让你琢磨半天了
你的fileUrl 抓取到是多少?对不对?
download(fileUrl.split('/')[-1], fileUrl, path) # 下载附件
这个方法又是怎么处理的??
你要注意你页面抓取的地址是个中间网址,打开以后会重定向到真实文件路径
好像直接就是抓不到fileurl
这个网站pdf是个中间网址,点击之后才能跳到真实路径
@扶荔: 对呀,所以参考我给你的网址,处理下302后得到的location。也就是真实文件地址
用requests爬虫拒绝301/302页面的重定向而拿到Location(重定向页面URL)的方法