获取全部城市的问题

正在回答

登陆购买课程后可参与讨论,去登陆

3回答

同学你好:

二手车网站的js进行了重新编译,同学可以使用下面的方法获取城市列表:

http://img1.sycdn.imooc.com//climg/5de76e06092ff29a06260745.jpg

从lxml对象中获取其中有城市id的script的内容。

获取所有城市的代码:

#从lxml对象中获取其中有城市id的script的内容。
script_js = guazi_html.xpath("//script[3]/text()")[0]
#从解析出的内容中使用功能正则表达式匹配出{}中所有的内容。
city_search = re.compile(r'({.*?});')

http://img1.sycdn.imooc.com//climg/5de76e1f09eb3a6e16130353.jpg

http://img1.sycdn.imooc.com//climg/5de76e30093f737716460773.jpg

代码:

import requests
#通过execjs这个包,来解析js
import execjs
import re
# from guazi_scrapy_project.guazi_scrapy_project.handle_mongo import mongo
#我们请求城市的接口
url = 'https://www.guazi.com/www/buy'
#cookie值要删掉,否则对方会根据这个值发现我们,并且屏蔽我们
#要通过正则表达式处理请求头,里面有空格,大家一定要注意
header = {
    "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
    "Accept-Encoding":"gzip, deflate, br",
    "Accept-Language":"zh-CN,zh;q=0.9",
    "Connection":"keep-alive",
    "Host":"www.guazi.com",
    "Referer":"https://www.guazi.com/www/buy",
    "Upgrade-Insecure-Requests":"1",
    "User-Agent":"Mozilla/5.0 (Windows NT 6.3; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3610.2 Safari/537.36",
}
response = requests.get(url=url,headers=header)
#设置返回的编码
response.encoding = 'utf-8'
if '正在打开中,请稍后' in response.text:
    #通过正则表达式获取了相关的字段和值
    value_search = re.compile(r"anti\('(.*?)','(.*?)'\);")
    string = value_search.search(response.text).group(1)
    key = value_search.search(response.text).group(2)
    #读取,我们破解的js文件
    with open('1.js','r',encoding="utf-8") as f:
        f_read = f.read()
    #使用execjs包来封装这段JS,传入的是读取后的js文件
    js = execjs.compile(f_read)
    js_return = js.call('anti',string,key)
    cookie_value = 'antipas='+js_return
    header['Cookie'] = cookie_value
    response_second = requests.get(url=url,headers=header)
    guazi_html = etree.HTML(response_second.text)
    script_js = guazi_html.xpath("//script[3]/text()")[0]
    city_search = re.compile(r'({.*?});')
    city = city_search.findall(script_js)
    # cityLeft获取城市的中文和英文名
    cityOne = json.loads(city[0])
    cityTwo = json.loads(city[1])
    A_N = [chr(i) for i in range(65, 78)]
    M_Z = [chr(i) for i in range(78, 91)]
    all_city = []
    for i in A_N:
       #根据获取相同首字母的城市列表
        each_list1 = cityOne.get(i)
        if each_list1:
            all_city.append(each_list1)
    for i in M_Z:
        each_list2 = cityTwo.get(i)
        if each_list2:
            all_city.append(each_list2)
print(all_city)
for each_list in all_city:
    for city in each_list:
        name = city['domain']
        cityname = city['name']
        print((name,cityname))

如果我解决了同学的问题,请采纳!学习愉快^_^。

提问者 努力而奋斗的蜗牛 2019-12-04 16:14:47

http://img1.sycdn.imooc.com//climg/5de76acf09d3d72f19201030.jpg

老师,我这里返回的HTML没有所有城市,这个该怎么办

提问者 努力而奋斗的蜗牛 2019-12-04 16:08:09

http://img1.sycdn.imooc.com//climg/5de769530964007b19140980.jpg

这里也有问题,我看老师可以搜索出来 而我就不行

问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
4.入门主流框架Scrapy与爬虫项目实战
  • 参与学习           人
  • 提交作业       107    份
  • 解答问题       1672    个

Python最广为人知的应用就是爬虫了,有趣且酷的爬虫技能并没有那么遥远,本阶段带你学会利用主流Scrapy框架完成爬取招聘网站和二手车网站的项目实战。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师