附:github源码
本文以爬取链家北京东城区租房信息为例。
先看一下我的目录结构:
__pycache__
db.py //简单封装操作mysql的工具类
getproxy.py //从西刺网获取免费网络代理,并存到ip.json中,取用
image.png
ip.json //存放免费网络代理
main.py //程序主入口
myhtml.py //解析链家网的内容获取需要的信息
其实这个例子没什么难的,简单介绍一下main文件,如果有不理解的地方可以给我留言。
爬去的地址:https://bj.lianjia.com/zufang/dongcheng/
import datetime
from myhtml import getHtml
from db import Db
#实例化db对象
db = Db()
#获取当前时间
start_time = datetime.datetime.now()
#爬取方法(爬取的页码)
def run(page):
global start_time,datetime
#调用自身时,可以一页一页往后爬
page=page+1
#第一页地址不加参数,从第二页开始加参数,pg?就是?页
quer = 'pg'+str(page) if page>1 else ''
url="https://bj.lianjia.com/zufang/dongcheng/"+quer
arr = getHtml(url)
#arr长度为0,则证明此页没数据,所有页已爬完,方法返回不再调用自身
if len(arr)==0:
db.close()
print('全爬完,总耗时:',(datetime.datetime.now()-start_time).seconds,'秒')
return
#这一段是为了将爬取的数据存入mysql,我没有好好封装db类,所以这里就稍微写的麻烦一些
keys=[]
for i in arr[0]:
keys.append(i)
value=[]
for i in arr:
tstr = ''
for idx in keys:
if isinstance(i[idx],str):
tstr +='"'+ i[idx]+'",'
else:
tstr+='"'+','.join(i[idx])+'",'
value.append(tstr[:-1])
# break
db.insert('beijing',keys,value)
#dos窗口打印信息
print(page,'页, ',len(arr),'条数据','over,计时',(datetime.datetime.now()-start_time).seconds,'秒')
#循环调用自身
run(page)
run(0)