+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2020-03(62)

2020-04(60)

2020-05(24)

2020-06(39)

2020-07(23)

python3爬虫(复制出原HTML正则匹配成功,换成原url时正则匹配出内容为空)

发布于2020-03-27 09:44     阅读(893)     评论(0)     点赞(21)     收藏(2)


0

1

2

3

4

python3爬取网站数据

1.原文格式
在这里插入图片描述
2.需求:多个tr中获取他们td里的值,并保存数据

3.实现

import re
import urllib.request
from urllib.parse import urlencode
import csv
import time

def get_one_page(url, page):
	#加头信息,User-Agent是有时候对方可能为了防爬虫做了判断,所以最好加上
	#content-type 传参x-www-form-urlencoded时需要加上
    headers = {'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8', 'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:23.0) Gecko/20100101 Firefox/23.0'}  
    #尽量少的次数查更多的数据 观察目标每页最多可展示多少条数据
    postdata = {
        "currentpage":page,
        "pagesize":40
    }
    data = urlencode(postdata).encode('utf-8')
    req = urllib.request.Request(url, data=data, headers=headers)  
    response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8')
    return html

def save_one_page(data):
    f = open('data.csv','a+',encoding='utf-8')
    csv_writer = csv.writer(f)
    for item in data:
        usedata = []
        for i in item:
            usedata.append(i)
        csv_writer.writerow(usedata)
    f.close()

def parse_one_page(html):
	#正则改了好久好久 有换行 换行后有空格
    pattern = re.compile('<tr.*?color:#535353.*?>[\s\S].*<td.*?>&nbsp;([\s\S]*?)</td>[\s\S].*<td.*?>[\s\S].*<a.*?id="(.*?)".*?>[\s\S] *([\s\S]*?)[\s\S].*</a></td>[\s\S].*<td.*?>[\s\S].*<a.*?>[\s\S] *([\s\S]*?)[\s\S].*</a></td>[\s\S].*<td.*?>[\s\S].*<a.*?>[\s\S] *([\s\S]*?)[\s\S].*</a>[\s\S].*</td>[\s\S].*<td.*?><a.*?>([\s\S]*?)</a></td>[\s\S].*<td.*?><a.*?>([\s\S]*?)</a></td>[\s\S].*</tr>')
    items = re.findall(pattern, html)
    return items

def main():
    url = 'http://www.****'
    for i in range(1,30):
        html = get_one_page(url, i)
        #下方为什么替换字符串,看下边
        html = (html.replace("\r\n","\n"))
        html = (html.replace("\t",""))
        data = parse_one_page(html)
        save_one_page(data)
        #睡几秒,原因是如果对方做了接口限频
        #或者,被封IP了怎么办
        time.sleep(3)
        print(i)

main()

这里为什么要替换字符串,讲讲故事
原网站速度很慢,所以把源码复制下来放自己网站,先匹配自己网站
自己的爬成功后,换成人家的url后,发现匹配出的内容为空
问题出在了哪里,一晚上,肉眼直接看愣是不会发现,之前也没复制出来匹配过
解决:把从复制的和人家网站获取的网页内容分别保存到txt文件中观察
发现文件大小不一样,复制的内容会把人家原本的\r\n和\t去掉
为了方便,已经写好的正则就没改了,直接把人家原本的html替换了字符串

原文链接:https://blog.csdn.net/huojiahui22/article/details/105111819

0

1

2

3

4

5

6

7



所属网站分类: 技术文章 > 博客

作者:9384vfnv

链接: https://www.pythonheidong.com/blog/article/286618/402402f1de4ed1a70176/

来源: python黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

21 0
收藏该文
已收藏

评论内容:(最多支持255个字符)