如下是咱们软工小组关于网络爬虫部分代码的的说明文档。至于一些分功能的小函数或方法就不在此赘述,一看就能明白。下面就主要的函数进行说明。php
从整体上来讲主要有三部分:店家信息爬取部分,菜品信息爬取部分,数据库部分。下面就三个部分一个一个说明。java
整个程序是用java实现的,因此数据库部分主要由两个类Db.java和Dbop.java组成。正则表达式
Db.java主要提供数据库的接口,包含以下:数据库
static { json
try {api
Class.forName(dbClassName);//加载驱动服务器
} catch (ClassNotFoundException e) {网络
// TODO Auto-generated catch blockapp
e.printStackTrace();函数
}
}
public static Connection getDbConnection() {//创建到MySQL的链接
try {
conn = DriverManager.getConnection(DbHost, user, password);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return conn;
}
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)
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两个类。他们分别是将爬虫的菜品信息爬取和店家信息爬取部署到服务器上实现爬虫程序的定时运行,实现了数据的定时自动更新。
* 基于 Zend Framework 编码规范
一、缩进为一个 Tab 或者 4 个空格,按层次缩进。
二、require/require_once 以及 include/include_once 统一使用标准调用写法,好比:
require_once 'Hush/Page.php';
require_once 'Hush/Db.php';
三、通常类库的名称必须以 ZF 方式的命名,好比:Path_To_Class
除开特殊的 Page 类、Service 类以及 Dao 类文件,他们的命名规则分别以下:
Dao 类:Database_Tablename {} 类文件在 Dao 类库目录下
Page 类:XxxPage {} 类文件在页面类库目录下
Service 类:XxxService {} 类文件在 Service 类库目录下
四、通常变量以及函数的名称以骆驼命名法(首字母小写),好比:
$variableName = 1;
public function methodName()
而 private/protected 变量或函数以 _ 开头,好比:private function _methodName()
五、类声名和函数声名后的第一个 { 符号换行,好比:
Class_Name
{
public function methodName ()
{
// TODO : method process
}
}
六、每一个文件顶部必须有该类的说明注释,好比:
<?php
/**
* XXX Dao
*
* @category XXX
* @package XXX_Dao
* @author zmpy
* @version $Id$
*/
七、每一个类文件前必须有类定义说明,好比:
...
/**
* @abstract
* @package XXX_Dao
*/
class XXX_Dao
{
...
八、被调用类库文件函数名前必须有说明注释(页面类可省略,由于基本不会被调用),好比:
...
/**
* 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
}
...
九、被调用类库文件后面的 php 结束符 ?> 可不用写。要写也能够,可是结束符后不要加任何字符。
一、缩进为一个 Tab 或者 4 个空格,按层次缩进。
二、包命名以com.app.takeout为前缀。包名的后续部分根据不一样功能各自命名规范而不尽相同。但均为小写字母。
三、通常变量以及函数的名称以骆驼命名法(首字母小写),好比:
variableName = 1;
public void methodName()
五、layout 命名
layout xml 的命名必须以 所有单词小写,单词间如下划线分割,而且使用名词或名词词组,即便用 模块名_功能名称 来命名。
六、id 命名
layout 中所使用的id必须以所有单词小写,单词间如下划线分割,而且使用名词或名词词组,而且要求可以经过id直接理解当前组件要实现的功能。
七、资源命名layout中所使用的全部资源(如drawable,style等)命名必须以所有单词小写,单词间如下划线分割,而且尽量的使用名词或名词组,即便用 模块名_用途 来命名。若是为公共资源,如分割线等,则直接用用途来命名