用 java 调用 python 的爬虫程序, 是一件很有意思的事情, 但解决方法大多不靠谱, 作者花了两天的时间, 动手实践, 最终完全解决了问题
java-python
Java 调用 Python 爬虫需要解决的问题:
参数传递问题
由 python 脚本通过, sys.argv[1] 读取参数
依赖包的问题
用 virtualenv 构建虚拟环境, 在虚拟环境安装所有相关依赖包, 用虚拟环境内的 python 解释器去执行 python 脚本, 可以完美解决依赖包问题
java 与 python 数据传递
python 脚本负责将爬取的内容保存为文件, 文件保存完成后, 由 java 程序读取文档内容
- import java.io.IOException;
- import java.io.File;
- public class BPython {
- public static void main(String[] args) {
- // 获取当前路径
- File directory = new File("");// 设定为当前文件夹
- String dirPath = directory.getAbsolutePath();// 获取绝对路径
- Process proc;
- try {
- // python 解释器路径
- String pyPath = "/Users/lijianzhao/.virtualenvs/py3/bin/python3";
- // python 脚本文件路径
- String pyFilePath = dirPath+ "/bdindex.py";
- System.out.println(pyFilePath);
- // 传给 python 的参数
- String argv1 = "一人之下";
- proc = Runtime.getRuntime().exec(pyPath + ""+ pyFilePath +" " +argv1);
- proc.waitFor();
- } catch (IOException e) {
- e.printStackTrace();
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- # coding=utf-8
- import requests
- from lxml import etree
- import os
- import sys
- def getData(wd):
- # 设置用户代理头
- headers = {
- # 设置用户代理头 (为狼披上羊皮)
- "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) ApplewebKit/537.36 (Khtml, like Gecko) Chrome/63.0.3239.132 Safari/537.36",
- }
- # 构造目标网址
- target_url = "https://www.baidu.com/s?wd="+str(wd)
- # 获取响应
- data = requests.get(target_url, headers = headers)
- # xpath 格式化
- data_etree = etree.HTML(data.content)
- # 提取数据列表
- content_list = data_etree.xpath('//div[@id="content_left"]/div[contains(@class,"result c-container")]')
- # 定义返回的字符串
- result = ""
- # 获取标题, 内容, 链接
- for content in content_list:
- result_title = "< 标题 >"
- bd_title = content.xpath('.//h3/a')
- for bd_t in bd_title:
- result_title += bd_t.xpath('string(.)')
- result_content = "< 内容 >"
- bd_content = content.xpath('.//div[@class="c-abstract"]')
- for bd_c in bd_content:
- result_content += bd_c.xpath('string(.)')
- try:
- result_link = "< 链接 >"+str(list(content.xpath('.//div[@class="f13"]/a[@class="c-showurl"]/@href'))[0])
- except:
- result_link = "< 链接 >: 空"
- result_list = [result_title, "\n" , result_content , "\n", result_link]
- for result_l in result_list:
- result += str(result_l)
- return result
- # 保存为文件
- def saveDataToFile(file_name, data):
- # 建立文件夹
- if os.path.exists("./data/"):
- pass
- else:
- os.makedirs("./data/")
- with open("./data/"+file_name+".txt", "wb+") as f:
- f.write(data.encode())
- def main():
- wd = ""
- print(wd)
- try:
- wd = sys.argv[1]
- except:
- pass
- if (len(wd) == 0):
- wd = "Hello"
- str_data = getData(wd)
- saveDataToFile(wd, str_data)
- print("end")
- if __name__ == '__main__':
- main()
小结
python 可能是最好用的爬虫语言, 以后遇到采集数据的需求时, 可以用 java 直接调用 python 的爬虫, 人生苦短, 我用 python
来源: http://www.jianshu.com/p/2edaf80c4c5d