首页 新闻 会员 周边 捐助

爬虫下载附件的问题,附件下载不下来,有大佬解答一下吗

0
悬赏园豆:30 [已解决问题] 解决于 2019-08-09 13:55

这个是目标网站: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('&nbsp;', '').replace('&nbsp;', '').replace('&ldquo;', '')
                        # 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()
’‘’

扶荔的主页 扶荔 | 初学一级 | 园豆:41
提问于:2019-07-25 16:30
< >
分享
最佳答案
0

还是你,方法是死的人是活的,首先你要是对单个网页爬取内容,直接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/,有问题可以私信我

收获园豆:30
小小咸鱼YwY | 老鸟四级 |园豆:3312 | 2019-07-25 18:38

好的!最近在恶补知识没有注意博客回复

扶荔 | 园豆:41 (初学一级) | 2019-07-29 15:13

@扶荔: 我帮你重新写一个好了,到时候私信你好了,这个很简单的不会超过50行

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-07-31 21:00

@小小咸鱼YwY: 好的,我去研读一下! 谢谢大佬

扶荔 | 园豆:41 (初学一级) | 2019-08-01 09:15

@小小咸鱼YwY: 大佬,url中间有个点,要用切片切掉,这种切中间的应该怎么写呀

扶荔 | 园豆:41 (初学一级) | 2019-08-01 10:46

@扶荔: 不要叫大佬啦,那个切片不实用吧一般用re

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-08-01 10:58

@小小咸鱼YwY: url_i = 'http://hbj.zhenjiang.gov.cn/zwgk/xmspys/hpwjsp/sqkgs' + url.get('href')。我是这么拼接的,href="./201904/t20190429_2138304.htm" href前面有个点,这个能用正则吗

扶荔 | 园豆:41 (初学一级) | 2019-08-01 10:59

@扶荔: 这种呀用切片就是后半段url[1:]

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-08-01 11:02

@小小咸鱼YwY: 对的,我在找在哪切

扶荔 | 园豆:41 (初学一级) | 2019-08-01 11:06

@扶荔: 就是在拼接前,后半部分有点的url,url[:1]别复杂化,先切后拼接,不要先拼接后切,先拼接用re会快一点

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-08-01 11:33

@小小咸鱼YwY: 好的

扶荔 | 园豆:41 (初学一级) | 2019-08-02 15:55

@小小咸鱼YwY: 我琢磨了半天发现在url.get('href')后面加个[1:]就可以了....

扶荔 | 园豆:41 (初学一级) | 2019-08-02 16:00

@扶荔: 我写太快了尴尬了写反了,https://www.cnblogs.com/pythonywy/p/10827528.html你看这个,我总结的切片工具用法你看看

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-08-05 17:20

@扶荔: 你发的消息好像被我QQ邮箱当垃圾邮件屏蔽了没看到

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-08-05 17:20

@扶荔: 切片工具其实有3个参数[参数1:参数2:切的方向],参数1为切的头,参数2为切的尾,切片工具顾头不顾尾,所有[1:]其实是第二个开始算起,参数2不填默认到最后,不好意思写快了没写清楚,让你琢磨半天了

小小咸鱼YwY | 园豆:3312 (老鸟四级) | 2019-08-05 17:25
其他回答(1)
0

你的fileUrl 抓取到是多少?对不对?

download(fileUrl.split('/')[-1], fileUrl, path) # 下载附件

这个方法又是怎么处理的??

心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-07-25 16:36

你要注意你页面抓取的地址是个中间网址,打开以后会重定向到真实文件路径

支持(0) 反对(0) 心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-07-25 16:44

好像直接就是抓不到fileurl

支持(0) 反对(0) 扶荔 | 园豆:41 (初学一级) | 2019-07-25 16:50

这个网站pdf是个中间网址,点击之后才能跳到真实路径

支持(0) 反对(0) 扶荔 | 园豆:41 (初学一级) | 2019-07-25 16:58

@扶荔: 对呀,所以参考我给你的网址,处理下302后得到的location。也就是真实文件地址

支持(0) 反对(0) 心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-07-26 18:23

用requests爬虫拒绝301/302页面的重定向而拿到Location(重定向页面URL)的方法

支持(0) 反对(0) 心雨纷扬 | 园豆:309 (菜鸟二级) | 2019-07-26 18:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册