python3.6 爬虫 上海所有教育机构地址,另外ac.txt为地区库(比如,静安寺为r812)
近期在做一个项目,所以自己学习了爬虫,开始爬上海教育机构地址。
代码如下:
# 注意,请修改cookie为你自己的cookie,否则点评网会封IP
# coding:utf-8
import urllib.request
import re
import os
import shutil # 高效处理文件的模块
import time
import random
from http import cookiejar
from http import cookies
from urllib import parse
#sys为system的缩写,引入此模块是为了改变默认编码
from imp import reload
from fake_useragent import UserAgent
import sys
reload(sys)
#读取最大页数并写入r12\ad.txt,然后读取第一页面的店名和地址,并写入文件地区码/page_n.txt
def getfirstDocument(pg):
page = str(pg+1)
path_name = directory + '\\' + page + '.txt'
#由于要搜索的关键词是中文,所以需要进行转码,这里调用了urllib.pathname2url函数
real_url = targethead + ac
print(real_url)
request = urllib.request.Request(real_url, headers = headers) #发送网络请求
response = urllib.request.urlopen(request) #得到网络响应
document = response.read().decode('utf-8') #将网页源码用UTF-8解码
items_name = re.findall(r'data-click-name="shop_title_click"\sdata-hippo-type="shop"\stitle="([^"]+)"\starget="_blank"\shref="', document, re.S) #正则匹配出商家名
items_address = re.findall(r'<span\sclass="addr">([^\s]+)</span>', document, re.S) #正则匹配出地址
result = ''
#print(items_name)
#print(items_address)
for index in range(min(len(items_name),len(items_address))):
#print(index)
#print(items_name[index] + ' ' + items_address[index]+ '\n')
result += items_name[index] + ' ' + items_address[index] + '\n'
file = open(path_name, 'w+'); #创建文件
file.write(result) #将结果存入文件
file.close()
print ('Area_',ac,'page_',page,'Complete!')
#先把第一页内容爬出来,然后把总页数爬出来。
items_page =re.findall(r'data-ga-page="([^"]+)"', document, re.S)
items_page1=(list(map(int,items_page)))
if items_page1==[]:
pagemax=1
else:
pagemax = max(items_page1)
print('最大页',pagemax)
path_name2 = directory + '\\' + 'ad.txt'
file2 = open(path_name2, 'w+',encoding='utf-8'); #创建文件
pagemax1=str(pagemax)
file2.write(pagemax1) #将结果存入文件
file2.close()
return(pagemax)
#读取第二页开始后面单一页面的店名和地址,并写入文件地区码/page_n.txt
def getDocument(pg):
page = str(pg+1)
path_name = directory + '\\' + page + '.txt'
#由于要搜索的关键词是中文,所以需要进行转码,这里调用了urllib.pathname2url函数
real_url = targethead + ac + 'p' + page
print(real_url)
request = urllib.request.Request(real_url, headers = headers) #发送网络请求
response = urllib.request.urlopen(request) #得到网络响应
document = response.read().decode('utf-8') #将网页源码用UTF-8解码
items_name = re.findall(r'data-click-name="shop_title_click"\sdata-hippo-type="shop"\stitle="([^"]+)"', document, re.S) #正则匹配出商家名
items_address = re.findall(r'<span\sclass="addr">([^\s]+)</span>', document, re.S) #正则匹配出地址
result = ''
#print(items_name)
#print(items_address)
for index in range(min(len(items_name),len(items_address))):
#print(index)
#print(items_name[index] + ' ' + items_address[index]+ '\n')
result += items_name[index] + ' ' + items_address[index] + '\n'
file = open(path_name, 'w+',encoding='utf-8'); #创建文件
file.write(result) #将结果存入文件
file.close()
print ('Area_',ac,'page_',page,'Complete!')
#根据传入directory创建同级目录,删除已经存在目录名
def createdic(directory):
if os.path.exists(directory):
shutil.rmtree(directory)
os.makedirs(directory) #删除后再创建对应的关键词目录
print ('delete existed directory successfully')
else:
os.makedirs(directory)
print ('create directory successfully')
#根据传入页面htmlhandle搜索目录下页面最大个数
#def checkmaxpage(htmlhandle):
# items_page = re.findall(r'data-ga-page="([^"]+)"', htmlhandle, re.S) #正则匹配出区域
# items_page1=(list(map(int,items_page)))
# pagemax=max(items_page1)
# return(pagemax)
# 1.1 目标选择:登陆目标页面,目标页面教育已经转码
host = 'http://www.dianping.com'
targethead= 'http://www.dianping.com/search/keyword/1/0_%E6%95%99%E8%82%B2/'
#cookies = ""
# 1.2 登录准备:登陆目标页面,自定义UA头部,直接用即可,不用理解细节
user_All = [
'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36',
]
user_agent = random.choice(user_All)
#user_agent = 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36'
headers = {'User-Agent':user_agent} #,'Cookie':cookies}
# 1.3 准备工作:读已经准备好的地区代码,txt文旦中/n回车为分割
f = open("ac.txt","r")
get = f.read()
areacode = get.split('\n')
print(areacode)
# 2.1创建目录:赋值地区码给目录使用
directory = areacode #Windows系统下,创建中文目录名前需要制定编码,这里统一用UTF-8
# 2.2创建目录: 先检查再创建所有编码区域的目录
m=0 #第几个二级地区code完成
k=0 #合计一共完成几个商铺抓取
for ac in areacode:
if os.path.exists(ac): #创建还是使用已有目录
m = m+1
print ('\n','第',m,'个目录:',ac,'已存在')
directory=ac
n=0 #第几个二级地区商铺完成
if os.path.exists(directory + '\\' + 'ad.txt'): #之前读过最大页数ad
f = open(directory + '\\' + 'ad.txt','r')
pagem = f.read()
pagem1=int(pagem)
for index in range(0, pagem1):
index1=str(index+1)
k=k+1
if os.path.exists(directory + '\\' + index1 + '.txt'): #过滤掉已经读取过得page页面
n=n+1
else:
getDocument(index)
n=n+1
time.sleep(10)
else:
pagem1=getfirstDocument(0)
for index in range(1, pagem1):
index1= str(index+1)
k=k+1
if os.path.exists(directory + '\\' + index1 + '.txt'):
n=n+1
else:
getDocument(index)
n=n+1
time.sleep(10)
else:
createdic(ac)