-
网络爬虫文档
以下是我们软工小组关于网络爬虫部分代码的的说明文档。至于一些分功能的小函数或方法就不在此赘述,一看就能明白。下面就主要的函数进行说明。
从总体上来说主要有三部分:店家信息爬取部分,菜品信息爬取部分,数据库部分。下面就三个部分一个一个说明。
数据库部分
整个程序是用java实现的,所以数据库部分主要由两个类Db.java和Dbop.java组成。
Db.java主要提供数据库的接口,包含如下:
-
-
- 静态加载数据库驱动
-
static {
try {
Class.forName(dbClassName);//加载驱动
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
-
-
- 建立到MySQL的连接,即建立到数据库的连接
-
public static Connection getDbConnection() {//建立到MySQL的连接
try {
conn = DriverManager.getConnection(DbHost, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
-
-
- 关闭到MySQL的连接,即关闭到数据库的连接
-
public static void closeDbConnection(Connection connection) {//关闭数据库MYSQL
if (connection != null) {
try {
if (!connection.isClosed()) {
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Dbop.java主要提供数据库的操作,包含如下:
-
-
- 将爬取的店家信息存入数据库
-
public static void InsertToStoreDb(long id,String StoreUrl,String StoreName,String LogoUrl,
int DeliveryTime,String Opentime,int Quantity,String Sale,String location,String lng,String lat)
-
-
- 清空店家信息表
-
public static void clearStore()
-
-
- 清空菜品信息
-
public static void clearProduct()
-
-
- 将爬取的菜品信息存入数据库
-
public static void insertToProductDb(long product_id,String product_name,String product_img,int price,String sold_quantity,String left_quantity,long store_id,String store_name,String lng,String lat,int delivery_time)
-
-
- 从数据库中取出店家名字
-
public static String getStoreName(int id)
-
-
- 取出送餐时间
-
public static String getStoreDeliveryTime(int id)
-
-
- 取出店家所在位置的经度
-
public static String getStoreLng(int id)
-
-
- 取出店家所在位置的纬度
-
public static String getStoreLat(int id)
店家信息爬取部分
这一部分主要是从饿了么网页上爬取店家相关的信息存入数据库。
首先是Storeurl.java
-
-
- 实例化网页分析器
-
public void createParser(String url) throws ParserException
-
-
- 重置网页分析器
-
public void resetParser()
-
-
- 爬取并将爬取的数据存入数据库(总函数)
-
public void crawlerToDb()
-
-
- 根据分析网页找到的节点进行信息提取
-
public void parserMethod(String url)
-
-
- 根据找到的特定节点提取店家链接和店家logo(后面还有相同的函数用于提取其他信息,就不一一赘述)
-
public void getStoreUanal(NodeFilter url,NodeFilter img,Parser parser) throws ParserException{//get store url and name and logo
其次是GetLungAndLat.java
-
-
- 百度提供的一个接口,用于查询地址的经纬度
-
public static String getCoordinate( String st)
{
String str= new String();//从服务器端获取的数据转换为字符串形式
String url = "http://api.map.baidu.com/geocoder/v2/?address="+st+"&output=json&ak=DWDtiXpQ9UBnnkwXmpoYYxLs";
try{
HttpGet request = new HttpGet(url);
HttpResponse response = HttpClients.createDefault().execute(request);
if(response.getStatusLine().getStatusCode()==HttpStatus.SC_OK)
str=EntityUtils.toString(response.getEntity());
}catch(Exception e)
{
e.printStackTrace();
}
return str;//.replace(' ', ',');
}
-
-
- 从百度提供的接口查询到的结果中分别提取经度和纬度。
-
public static String getLnAndLa(String address)
-
-
- 利用正则表达式处理出错的查询结果,主要用于查询提取经纬度时使用。
-
public static String special(String address)
菜品信息爬取部分
这个则主要根据前面爬取的店家信息中店家链接爬取相应店家的菜品信息,主要是product.java。具体如下:
-
-
- 根据相应爬取分析得到的菜品数据存入数据库(主函数)
-
public void crawlerToDbproduct()
-
-
- 判断是否该店家的信息是否已经爬取并存入数据库,如果已经存入数据库,则不进行爬取,否则进行爬取。
-
public static boolean ifExist(List<String> usedlink,String url)
-
-
- 根据提供的店家链接进行相应的信息提取
-
public void parserMethod(String url)
-
-
- 根据网页分析器找到的节点提取店家名字(后面有很多相似的分程序,一看就明白,就不在次赘述)
-
public void getProductName(NodeFilter n,Parser parser) throws ParserException
到此,整个爬虫程序的主体部分已经说明清楚。
优化部署部分
这部分主要是后期在优化程序和部署程序时对原程序做的修改,主要包括ProductTime.java和StoreTime.java两个类。他们分别是将爬虫的菜品信息爬取和店家信息爬取部署到服务器上实现爬虫程序的定时运行,实现了数据的定时自动更新。
-
服务端文档
服务端文档借助phpdoc工具自动生成齐全文档。
-
客户端文档
客户端文档借助javadoc文档自动生成齐全文档。
-
服务端代码规范
* 基于 Zend Framework 编码规范
1、缩进为一个 Tab 或者 4 个空格,按层次缩进。
2、require/require_once 以及 include/include_once 统一使用标准调用写法,比如:
require_once 'Hush/Page.php';
require_once 'Hush/Db.php';
3、一般类库的名称必须以 ZF 方式的命名,比如:Path_To_Class
除开特殊的 Page 类、Service 类以及 Dao 类文件,他们的命名规则分别如下:
Dao 类:Database_Tablename {} 类文件在 Dao 类库目录下
Page 类:XxxPage {} 类文件在页面类库目录下
Service 类:XxxService {} 类文件在 Service 类库目录下
4、一般变量以及函数的名称以骆驼命名法(首字母小写),比如:
$variableName = 1;
public function methodName()
而 private/protected 变量或函数以 _ 开头,比如:private function _methodName()
5、类声名和函数声名后的第一个 { 符号换行,比如:
Class_Name
{
public function methodName ()
{
// TODO : method process
}
}
6、每个文件顶部必须有该类的说明注释,比如:
<?php
/**
* XXX Dao
*
* @category XXX
* @package XXX_Dao
* @author zmpy
* @version $Id$
*/
7、每个类文件前必须有类定义说明,比如:
...
/**
* @abstract
* @package XXX_Dao
*/
class XXX_Dao
{
...
8、被调用类库文件函数名前必须有说明注释(页面类可省略,因为基本不会被调用),比如:
...
/**
* Load data by primary key id
*
* @param mixed $id Primary key value
* @param string $pk Primary key name
* @return array
*/
public function methodName ()
{
// TODO : method process
}
...
9、被调用类库文件后面的 php 结束符 ?> 可不用写。要写也可以,但是结束符后不要加任何字符。
-
客户端代码规范
1、缩进为一个 Tab 或者 4 个空格,按层次缩进。
2、包命名以com.app.takeout为前缀。包名的后续部分根据不同功能各自命名规范而不尽相同。但均为小写字母。
3、一般变量以及函数的名称以骆驼命名法(首字母小写),比如:
variableName = 1;
public void methodName()
5、layout 命名
layout xml 的命名必须以 全部单词小写,单词间以下划线分割,并且使用名词或名词词组,即使用 模块名_功能名称 来命名。
6、id 命名
layout 中所使用的id必须以全部单词小写,单词间以下划线分割,并且使用名词或名词词组,并且要求能够通过id直接理解当前组件要实现的功能。
7、资源命名
layout中所使用的所有资源(如drawable,style等)命名必须以全部单词小写,单词间以下划线分割,并且尽可能的使用名词或名词组,即使用 模块名_用途 来命名。如果为公共资源,如分割线等,则直接用用途来命名