公司的背景需求是:先爬取GB网站再爬取粮食网站,用GB网站的基本信息调用粮食网站的搜索功能,实现搜索查询。
为什么是搜索查询?
粮食网站展示的数据是假数据,很多数据没有展示,但搜索特定信息是能搜到的。
爬取GB网站:基本信息
有反爬机制,难点:
-
点击界面内容,其url不会改变
解决:使用webdriver模拟浏览器事件进行爬取。
-
有验证码,且验证码是一个覆盖在下载页面的页面,不能右键,不能跳过
解决:使用PIL 进行网页部分截图,截取验证码后使用ddddocr实现验证码识别
有个问题是不能查看页面源码,使用断点查看请求下来的代码保存到本地,或使用ctrl+s将网页保存为mhtml文件。之后可以进行源代码的查看。
使用XPATH进行定位,XPATH直接在chroom浏览器右键提取
之后爬取食品网站:
并将爬取到的pdf通过python调用java服务的接口,将pdf文件放到MinIO服务器中。
python发送post请求到Java程序,编写MinIO操作类。
难点:发送POST请求携带文件时,需要设置请求头multipart/form-data; boundary=<calculated when request is sent>
设置之后发现boundary是动态生成的,如果写死会导致覆盖了原来的请求头,传的文件参数无效。
解决:使用MultipartEncoder构建 multipart/form-data
请求体,并将文件作为data参数传入
#发送post请求到后台上传文件
def post_file(url, response):
multipart_data = MultipartEncoder(fields={'file': ('filename', response.content, 'application/pdf')})
headers = {'Content-Type': multipart_data.content_type}
result = requests.post(url, data=multipart_data, headers=headers)
return result