100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 爬虫系列(1):极简爬虫——基于requests和re爬取安居客上海二手房价数据

爬虫系列(1):极简爬虫——基于requests和re爬取安居客上海二手房价数据

时间:2022-09-03 00:44:28

相关推荐

爬虫系列(1):极简爬虫——基于requests和re爬取安居客上海二手房价数据

爬虫系列(1):极简爬虫——基于requests和re爬取安居客上海二手房价数据

入坑爬虫已经有一年多,一直想好好记录下从各位前辈和大佬处学到的技术,因此开了一个爬虫系列,想借此细致地介绍和演示其中的一些爬虫技术(需要注意的是,在获取数据过程中应当严格遵守相关法律法规规定!!!)。系列开篇先与大家交流一下最简单的爬虫包requests库(我认为是这样),对于一般的静态网站,利用requests库也是足矣hhhhh

爬虫流程

爬虫的大体流程可以归纳为以下几步:

(1)确定要爬取的内容

(2)确定要爬取内容所在的网页

(3)构建请求

(4)发送请求并返回网页内容

(5)解析内容

我们以爬取安居客网页中上海的二手房价为例演示上述步骤

导入库

最常用也是最基础的爬虫库为requests,解析网页内容笔者一般习惯用正则表达式(简单暴力),因此导入re库,可能在构建请求头headers时还会用random库,所以也将其一并导入。

import requestsimport reimport random

根据要爬取内容确定要爬取的网页

首先我们进入安居客上海二手房市场Web网址:/market/

我们想要获取的内容是这张上海房价走势图当中所呈现的去年4月到今年3月过去一年的月度房价信息,因此就需要找找这部分的数据藏在哪:

①右键打开检查/检查元素(一般是最后一个按钮,不同浏览器不一样),出现类似像下面这样的页面,这是构成网址的各类元素和子网页,包括各种图片、script脚本、js文件等等。

②寻找到数据所在文件的url:一般点击Preview、Response就可以呈现该网页元素所含有的内容,但是这么多网页元素,一个一个找会非常费时,因此教一个快速的办法,就是在Network的search搜索栏,搜索某个所要找的数据,实现快速定位。

比如我们发现在上面那张走势图当中,去年10月份的房价是52322,那我们就在搜索栏中搜索52322,结果真就出来一个网址,点进去定位到数据所在位置,结果恰好是一个含有12个数据的序列,一对照,正好就是我们要找的数据。

③确定数据所在网页的请求头信息(翻到headers),相关信息如下,我们主要要获取的是该网页的URL、Host、referer、user-agent、cookie这些信息,不过这个网页没有Host,因此拿到其它四个信息即可。

构建请求代码

确定好要请求的url对象和请求头headers后,开始请求代码的书写

url="/market/"browser_list=['Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; SE 2.X MetaSr 1.0; SE 2.X MetaSr 1.0; .NET CLR 2.0.50727; SE 2.X MetaSr 1.0)','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)','Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11','Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; TencentTraveler 4.0; .NET CLR 2.0.50727)','Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:86.0) Gecko/0101 Firefox/86.0']headers={'User-Agent':browser_list[random.randint(0,4)],'Referer':'/market/pudong/','cookie':'aQQ_ajkguid=75D55F9D-6951-1C4B-39D1-FED8B3BC4536; 58tj_uuid=3e9b30cc-8c32-46c4-bc53-151691f3b5ae; isp=true; _ga=GA1.2.1828658534.1581134986; id58=e87rkF8P0dem+m6DBL+MAg==; __xsptplus8=8.9.1596182243.1596182251.2%233%%7C%7C%7C%7C%23%23aqyY8aoaWIV-eOs35ozx07sNNk9mQPFD%23; ctid=11; als=0; sessid=D21E382D-0B8D-601D-FF5F-9C804F655815; twe=2; wmda_uuid=d7d47320d73ae1d5b73b8503d3133dfb; wmda_session_id_6289197098934=1616588899503-a1616f77-84aa-dd50; wmda_visited_projects=%3B6289197098934; new_session=1; init_refer=https%253A%252F%%252F; new_uv=17; _gid=GA1.2.2103742664.1616588900; obtain_by=2; xxzl_cid=f0aad34a1bd54aa4920ca41164c6eccd; xzuid=818ce2d7-8491-4739-ae4a-5ef4e547e340'}res=requests.get(url=url,headers=headers,verify=False)

需要提一下的是,为了防止反爬,我在这里构建了user-agent的列表,里面包含了5种浏览器类型,利用random函数去随机选择一个浏览器类型进行访问。实际上,在requests请求命令中添加headers的目的,也是为了模拟出一个真实的请求。更高级的反爬方法会借用proxies的方法利用多个代理ip去爬取网站,但是笔者亲测,目前一些代理ip网站上开放的免费ip,十个有九个都用不了,加之本次爬取仅为演示,因此就不再构造代理ip。

获得数据

①获得网页源代码:

把请求得到的res变量输出它的文本值,打印一下,就可以看到下面的网页源代码。

content=res.textprint(content)

①利用正则表达式获取目标数据:

网页源代码中这么多数据,不可能每一次都这么去一个个地找,因此可以利用正则表达式来快速获取数据,首先先分析数据的存储结构,这部分数据存储的标识id叫做regionChart,应该是全文唯一,然后列表前面有个"data":,列表的后面有个}],掌握这些信息我们就可以构建正则表达式的搜索模式了。

pattern=pile('regionChart.*?"data":(.*?)]}]',re.S)results=re.findall(pattern,content)print(results)

利用正则表达式搜索,print一下得到目标数据。值得注意的是,正则表达式输出的是列表型数据,但是这个列表当中只有一个元素,内嵌在里面的那个列表(看上去是列表)实质上是一个个的字符串,如果想要获得一个包含12个数据的列表数据,利用eval函数即可。

print(eval(results[0]))

以上就是爬取安居客上海过去一年二手房价的全过程,如果想要加上日期序列的话,大家也可以尝试再对正则表式进行完善,得到源码当中的日期序列。

总结

利用requests去爬取网页数据,拥有快捷简单代码量少的优点。在这一过程中,笔者认为有三个需要重点关注的点:

①必须要准确找到数据所在的网页url,很多人(包括刚入门的我)会把Web网址的地址作为目标url(事实上,这个安居客的例子中的确目标网页url和大的Web网址url相同),但是在更多情况下,数据会存储在script、js等文件当中,具有不同的url;

②第二,理清楚数据的存储结构,找到数据前后的唯一标识符,合理构建正则表达式;

③第三,在利用正则表达式获得数据之后并不就是一劳永逸了,还判断数据类型,根据实际所需作出数据调整,确保最终得到的是可用的数据。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。