Python3爬虫全国地址信息
PHP方式写的一团糟所以就用python3重写了一遍,所以因为第二次写了,思路也更清晰了些。
提醒:可能会有502的错误,所以做了异常以及数据库事务处理,暂时没有想到更好的优化方法,所以就先这样吧。待更懂python再进一步优化哈
欢迎留言赐教~
#!C:\Users\12550\AppData\Local\Programs\Python\Python37\python.exe
#-*-coding:utf-8-*-
fromurllib.requestimporturlopen
frombs4importBeautifulSoup
importpymysql
importurllib.request
importre
fromurllib.errorimportURLError,HTTPError
conn=pymysql.connect(host='127.0.0.1',user='root',passwd='root',db='test',charset='utf8')
db=conn.cursor()
curr_url=''
#请求网页
defget_html(url):
globalcurr_url
user_agent='Mozilla/6.0(WindowsNT6.1;Win64;x64)AppleWebKit/537.36(KHTML,likeGecko)Chrome/67.0.6796.99Safari/537.36'
response=urllib.request.Request(url)
response.add_header('User-Agent',user_agent)
response=urllib.request.urlopen(response)
html=BeautifulSoup(response.read(),"html.parser",from_encoding='gbk')
returnhtml
defget_list(url,level=1,pid=0,get_level=2):
data=[];
level_arr={'1':'provincetr','2':'citytr','3':'countytr','4':'towntr','5':'villagetr'}
try:
print(url)
html=get_html(url)
c_url=url
tr_list=html.findAll('tr',{'class':level_arr[str(level)]})
fortrintr_list:
region_name,href,page='','',''
td_list=tr.findAll('td')
fortdintd_list:
region_name=td.get_text();
#判断是否存在该省份
if(level==1):
sql="select*fromregionwhereregion_name='"+region_name+"'"
db.execute(sql)
exist=db.fetchone()
if(exist):
continue
#判断是否全数字-非法则跳过
if(region_name.isdigit()):
continue
if(region_name):
sql="insertintoregion(region_name,pid,level,url)value('"+region_name+"','"+str(
pid)+"','"+str(level)+"','"+url+"')"
db.execute(sql)
db.execute('SELECTLAST_INSERT_ID();')
last_id=db.fetchone()[0]
if(td.a):
page=td.a.attrs['href']
pattern=re.compile(r'\w*.html')
url=re.sub(pattern,page,c_url)
if(level<=get_level):
get_list(url,level+1,last_id)
#每个省份执行完成,则提交
if(level==1):
conn.commit()
returndata;
exceptHTTPErrorase:
#如果有出错,则回滚
conn.rollback()
print(e)#HTTPError502:ProxyError
url='http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2017/index.html'
get_list(url)
print('执行完成')
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接