利用正则表达式爬取官网数据及反反爬虫方法分析

num = 22077
wb = xlwt.Workbook()
ws = wb.add_sheet("旅游人数")
ws.write(0, 0, "序号")
ws.write(0, 1, "时间")
ws.write(0, 2, "数据")
t = 0
#def pachong():
while True:
    try:
        sleep_time = random.randint(0,2)+random.random()
        time.sleep(sleep_time)
        #ua = UserAgent()
        headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36'}
        #headers = {'User-Agent':ua.random}
        url1 = 'http://whlyw.cq.gov.cn/content-2551-'
        url2 = '-1.html'

        num = num - 1
        url = str(url1)+str(num)+str(url2)
        print(url)

        r = requests.get(url,headers)
        soup = BeautifulSoup(r.text, 'html.parser')
        content = soup.prettify()
        #print(content)
        #result = re.search('据初步统计测算(.*?)年1—(.*?)月全市接待海内外游客(.*?)万人次',content)
        result = re.search("据初步统计测算(.*?)游客(.*?)万人次", content)
        if result:
            a = result.group(1)
            b = result.group(2)
            print(a,b)
            t = t + 1
            ws.write(t , 0, t + 1)#序号
            ws.write(t, 1, a)

            ws.write(t , 2, b)
            wb.save('./重庆旅游数据1.xls')
    except:
        print("出现异常")
        time.sleep(60)

        continue
    else:
        print("正常")
        if num < 13615:
            break

在这里插入图片描述

目标

博主目标是爬取目标网站中关于旅游人数的数字信息。所以首先想到的就是使用正则表达式进行匹配。因为每个月的统计文档是固定的,因此使用正则表达式“据初步统计测算(.?)游客(.?)万人次”便可以很好的爬取时间信息和旅游人数信息。

但是因为爬取数量将多,博主遇到了‘’远程主机强迫关闭了一个现有的连接 socket 超时设置 errno 10054‘错误

因此需要从反反爬虫方法着手

首先考虑time.sleep()方法,通过随机暂停一部分时间,减低被服务器拒绝的概率
其次,还可以通过fake_useragent来自动生成headers头,这代表了访问该网站的游览器信息,通过UserAgent().random()随机产生游览器信息,更加降低被访问网站服务器拒绝的可能
第三,如果被拒绝后,使用异常处理except让程序休眠60s后再继续运行,则又可以顺利运行。
第四,有时候还需要使用代理ip的方法,但是因为前三种方法已经解决了博主的问题,便不做研究。

猜你喜欢

转载自blog.csdn.net/qq_42967630/article/details/104499193
今日推荐