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的方法,但是因为前三种方法已经解决了博主的问题,便不做研究。