python3.6 爬虫 上海所有教育机构地址

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)



  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值