正在回答
3回答
同学你好:
二手车网站的js进行了重新编译,同学可以使用下面的方法获取城市列表:
从lxml对象中获取其中有城市id的script的内容。
获取所有城市的代码:
1 2 3 4 | #从lxml对象中获取其中有城市id的script的内容。 script_js = guazi_html.xpath( "//script[3]/text()" )[ 0 ] #从解析出的内容中使用功能正则表达式匹配出{}中所有的内容。 city_search = re. compile (r '({.*?});' ) |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 | 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)) |
如果我解决了同学的问题,请采纳!学习愉快^_^。
4.入门主流框架Scrapy与爬虫项目实战
- 参与学习 人
- 提交作业 107 份
- 解答问题 1672 个
Python最广为人知的应用就是爬虫了,有趣且酷的爬虫技能并没有那么遥远,本阶段带你学会利用主流Scrapy框架完成爬取招聘网站和二手车网站的项目实战。
了解课程
恭喜解决一个难题,获得1积分~
来为老师/同学的回答评分吧