这几天没啥事,就想着爬取一下app上面的内容。
我这边的系统是用windows,先安装好了mitmproxy跟手机证书
由于windows上面不能打开mitmproxy的调试窗口,所以这边就用的charles抓包工具进行抓包。
先编写好程序
import json
import pymongo
from mitmproxy import ctx
client = pymongo.MongoClient(host='localhost', port=27017)
db = client['igetget']
collection = db['books']
def response(flow):、
global collection
url='https://m.igetget.com/hybrid/api/ebook/list'
if flow.request.url.startswith(url):
text=flow.response.text
data=json.loads(text)
books=data.get('data')
for book in books:
data={
'title':book.get('operatingTitle'),
'cover':book.get('cover'),
'summary':book.get('otherShareSummary'),
'price':book.get('currentPrice'),
'anthor':book.get('bookAuthor')
}
ctx.log.info(str(data))
collection.insert(data)
这样写的代码在windows的cmd中执行mitmdump -s filename.py运行程序,总是报错
然后百度了半天说是因为pymongo的版本过低,应该用insert方法插入,或者3.x的版本就用insert_one/many方法插入,看了我的版本是最新的,方法也试完了,还是不能解决。后面看了我的就是不能解决,按道理不应该啊,在pycharm中就不会存在这种问题的。
后来分析了一下报错的原因,改了下代码如下:
import json
import pymongo
from mitmproxy import ctx
def response(flow):
client = pymongo.MongoClient(host='localhost', port=27017)
db = client['igetget']
collection = db['books']
url='https://m.igetget.com/hybrid/api/ebook/list'
if flow.request.url.startswith(url):
text=flow.response.text
data=json.loads(text)
books=data.get('data')
for book in books:
data={
'title':book.get('operatingTitle'),
'cover':book.get('cover'),
'summary':book.get('otherShareSummary'),
'price':book.get('currentPrice'),
'anthor':book.get('bookAuthor')
}
ctx.log.info(str(data))
collection.insert(data)
这样就完美解决了,但是按道理不应该啊,我上面是加了global的,不知道各位大佬给解释下