A. 怎麼利用爬蟲技術抓取淘寶搜索頁面的產品信息
可以通過requests庫re庫進行淘寶商品爬蟲爬取
import requests
import re
def getHTMLText(url):
try:
r= requests.get(url,timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return ""
def parsePage(ilt,html):
try:
plt = re.findall(r'\"view_price\":\"[\d+\.]*\"',html)
tlt = re.findall(r'\"raw_title\"\:\".*?\"',html)
for i in range(len(plt)):
price = eval(plt[i].split(':')[1])
title = eval(tlt[i].split(':')[1])
ilt.append([price,title])
except:
print("F")
def printGoodsList(ilt):
tplt = "{:4}\t{:8}\t{:16}"
print(tplt.format("序號","價格","商品名稱"))
count = 0
for g in ilt:
count = count +1
print(tplt.format(count,g[0],g[1]))
def main():
goods = '書包'
depth = 2
start_url = "https://s.taobao.com/search?q="+ goods
infoList = []
for i in range(depth):
try:
url = start_url +'&s='+str(44*i)
html = getHTMLText(url)
parsePage(infoList,html)
except:
continue
printGoodsList(infoList)
main()
這段代碼在過去是可以爬取淘寶商品信息,但是因為淘寶的反扒技術升級,便不能讓你大搖大擺地進出自如了。
此外也可以藉助採集實現採集
B. 如何識別搜索引擎爬蟲
親
搜索引擎爬蟲到訪網站你可以從網站日誌中看出來
主要的是spider
其他的google 搜狗 360 bing ……
希望能夠幫助到你吧 好運哦
C. 如何用python實現在爬取到某網頁搜索框中,並輸入文字後,自動搜索信息並抓取
網路爬蟲只能根據你指定的url爬取網頁的html代碼,至於你想要包含指定內容的網頁的話,只能先爬取下來網頁,然後在對頁面內容進行匹配(正則,也有開源工具)找到你想要的內容就可以了!順便說一句網路爬蟲不能根據關鍵字來爬取網頁!
D. 如何使用webcollector爬取搜索引擎
使用WebCollector來爬取網路搜索引擎按照關鍵字搜索的結果頁面,解析規則可能會隨網路搜索的改版而失效。
代碼如下:
[java] view plain
package com.wjd.key.crawler;
import java.io.ByteArrayInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.URLEncoder;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.TimeZone;
import org.apache.poi.poifs.filesystem.DirectoryEntry;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import cn.e.hfut.dmic.contentextractor.ContentExtractor;
import cn.e.hfut.dmic.webcollector.model.CrawlDatum;
import cn.e.hfut.dmic.webcollector.model.CrawlDatums;
import cn.e.hfut.dmic.webcollector.model.Page;
import cn.e.hfut.dmic.webcollector.plugin.ram.RamCrawler;
public class BdiKeywordCrawler extends RamCrawler{
private Connection connection;
private PreparedStatement pstatement;
// 連接MySql資料庫,用戶名root,密碼mahao
String url = "jdbc:mysql://localhost:3306/wjd";
String username = "root";
String password = "mahao";
//保存抽取到的數據
StringBuilder result = new StringBuilder();
public BdiKeywordCrawler(String keyword, int maxPageNum) throws Exception {
for (int pageNum = 1; pageNum <= maxPageNum; pageNum++) {
String url = createUrl(keyword, pageNum);
CrawlDatum datum = new CrawlDatum(url)
.putMetaData("keyword", keyword)
.putMetaData("pageNum", pageNum + "")
.putMetaData("pageType", "searchEngine")
.putMetaData("depth", "1");
addSeed(datum);
}
}
@Override
public void visit(Page page, CrawlDatums next) {
String keyword = page.getMetaData("keyword");
String pageType = page.getMetaData("pageType");
int depth = Integer.valueOf(page.getMetaData("depth"));
if (pageType.equals("searchEngine")) {
int pageNum = Integer.valueOf(page.getMetaData("pageNum"));
System.out.println("成功抓取關鍵詞" + keyword + "的第" + pageNum + "頁搜索結果");
// || div[class=result-op c-container xpath-log ]>h3>a
Elements results = page.select("div[class=result c-container ]>h3>a");
// Elements results1 = page.select("div[class=result-op c-container xpath-log]>h3>a");//,div[id=result-op c-container xpath-log]>h3>a
//System.out.println(results1.get(0));
//results.add(results1.get(0));
for (int rank = 0; rank < results.size(); rank++) {
Element result = results.get(rank);
/*
* 我們希望繼續爬取每條搜索結果指向的網頁,這里統稱為外鏈。
* 我們希望在訪問外鏈時仍然能夠知道外鏈處於搜索引擎的第幾頁、第幾條,
* 所以將頁號和排序信息放入後續的CrawlDatum中,為了能夠區分外鏈和
* 搜索引擎結果頁面,我們將其pageType設置為outlink,這里的值完全由 用戶定義,可以設置一個任意的值
* 在經典爬蟲中,每個網頁都有一個refer信息,表示當前網頁的鏈接來源。
* 例如我們首先訪問新浪首頁,然後從新浪首頁中解析出了新的新聞鏈接,
* 則這些網頁的refer值都是新浪首頁。WebCollector不直接保存refer值,
* 但我們可以通過下面的方式,將refer信息保存在metaData中,達到同樣的效果。
* 經典爬蟲中錨文本的存儲也可以通過下面方式實現。
* 在一些需求中,希望得到當前頁面在遍歷樹中的深度,利用metaData很容易實現
* 這個功能,在將CrawlDatum添加到next中時,將其depth設置為當前訪問頁面 的depth+1即可。
*/
CrawlDatum datum = new CrawlDatum(result.attr("abs:href"))
.putMetaData("keyword", keyword)
.putMetaData("pageNum", pageNum + "")
.putMetaData("rank", rank + "")
.putMetaData("pageType", "outlink")
.putMetaData("depth", (depth + 1) + "")
.putMetaData("refer", page.getUrl());
next.add(datum);
}
} else if (pageType.equals("outlink")) {
/*int pageNum = Integer.valueOf(page.getMetaData("pageNum"));
int rank = Integer.valueOf(page.getMetaData("rank"));
String refer = page.getMetaData("refer");*/
try {
String content = ContentExtractor.getContentByUrl(page.getUrl());
/*String line = String.format(
"第%s頁第%s個結果:標題:%s(%s位元組)\tdepth=%s\trefer=%s", pageNum,
rank + 1, page.getDoc().title(), content,
depth, refer);*/
String line = String.format("標題:%s\n來源:%s\n正文:%s", page.getDoc().title(),page.getUrl(),content);
HashMap<String, String> data = new HashMap<String,String>();
Date currentDate = new java.util.Date();
SimpleDateFormat myFmt = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
TimeZone timeZoneChina = TimeZone.getTimeZone("Asia/Shanghai");// 獲取中國的時區
myFmt.setTimeZone(timeZoneChina);// 設置系統時區
String grabTime = myFmt.format(currentDate);// new Date()為獲取當前系統時間
data.put("title", page.getDoc().title());
data.put("from", page.getUrl());
data.put("content", content);
data.put("grabTime", grabTime);
//String line = String.format("標題:%s\n", page.getDoc().title());
//持久化到word文檔中
//是否為線程安全???
//synchronized(this) {
String destFile = "D:\\"+"Result"+keyword+".doc";
result.append(line);
//將result寫到doc文件中
write2File(destFile,result.toString());
//添加到資料庫中
addResultData(data);
//}
System.out.println(line);
} catch (Exception e) {
//e.printStackTrace();
System.out.println("鏈接"+page.getUrl()+"失效");
}
}
}
//將數據保存到mysql資料庫中
private void addResultData(HashMap<String, String> data) {
String title = data.get("title");
String source_url = data.get("from");
String content = data.get("content").replaceAll("\\?{2,}", "");//去掉字元串中出現的多個連續問號。
//抓取時間
String grabTime = data.get("grabTime");
/*SimpleDateFormat format = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date = null;
try {
date = format.parse(grabTime);
} catch (Exception e) {
e.printStackTrace();
}*/
//System.out.println("抓取時間"+grabTime);
try {
connection = DriverManager.getConnection(url, username, password);
String sql = "INSERT INTO wjd_keyword_search_table(TITLE,GRAP_TIME,CONTENT,SOURCE_URL) VALUES(?,?,?,?)";
String checkSql = "select 1 from wjd_keyword_search_table where TITLE='" + title + "'";
Statement statement = connection.prepareStatement(checkSql);
ResultSet result = statement.executeQuery(checkSql);
if (!result.next()) {
// 如果資料庫中不存在該記錄,則添加到資料庫中
pstatement = connection.prepareStatement(sql);
pstatement.setString(1, title);
//pstatement.setString(2, date);
pstatement.setString(2,grabTime);
pstatement.setString(3, content);
pstatement.setString(4, source_url);
pstatement.executeUpdate();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 將數據持久化到本地doc文件中
* @param destFile
* @param line
*/
private void write2File(String destFile, String line) {
try {
//doc content
ByteArrayInputStream s = new ByteArrayInputStream(line.getBytes());
POIFSFileSystem fs = new POIFSFileSystem();
DirectoryEntry directory = fs.getRoot();
directory.createDocument("WordDocument", s);
FileOutputStream ostream = new FileOutputStream(destFile);
fs.writeFilesystem(ostream);
s.close();
ostream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
String[] keywordsList = {"網路爬蟲","搜索引擎"};
int pageToal =5;
for (String keyword : keywordsList) {
BdiKeywordCrawler crawler = new BdiKeywordCrawler(keyword, pageToal);
crawler.start();
}
}
/**
* 根據關鍵詞和頁號拼接網路搜索對應的URL
*/
public static String createUrl(String keyword, int pageNum)
throws Exception {
int first = (pageNum-1) * 10;
keyword = URLEncoder.encode(keyword, "utf-8");
return String.format("https://www..com/s?wd=%s&pn=%s",
keyword, first);
}
}
E. 什麼是搜索引擎爬蟲
搜索引擎爬蟲 (又被稱為網頁蜘蛛,網路機器人),是一種按照一定的規則,自動的抓取萬維網信息的程序或者腳本。
2、然後將其和網頁相對路徑名稱交給網頁下載器,網頁下載器負責頁面內容的下載。對於下載到本地的網頁,一方面將其存儲到頁面庫中,等待建立索引等後續處理;另一方面將下載網頁的URL放入已抓取URL隊列中,這個隊列記載了爬蟲系統已經下載過的網頁URL,以避免網頁的重復抓取。
3、對於剛下載的網頁,從中抽取出所包含的所有鏈接信息,並在已抓取URL隊列中檢查,如果發現鏈接還沒有被抓取過,則將這個URL放入待抓取URL隊列末尾,在之後的抓取調度中會下載這個URL對應的網頁。如此這般,形成循環,直到待抓取URL隊列為空,這代表著爬蟲系統已將能夠抓取的網頁盡數抓完,此時完成了一輪完整的抓取過程。
F. 如何讓網頁被爬蟲抓取
網站建設好了,當然是希望網頁被搜索引擎收錄的越多越好,但有時候我們也會碰到網站不需要被搜索引擎收錄的情況。
比如,要啟用一個新的域名做鏡像網站,主要用於PPC 的推廣,這個時候就要想辦法屏蔽搜索引擎蜘蛛抓取和索引我們鏡像網站的所有網頁。因為如果鏡像網站也被搜索引擎收錄的話,很有可能會影響官網在搜索引擎的權重。
以下列舉了屏蔽主流搜索引擎爬蟲(蜘蛛)抓取/索引/收錄網頁的幾種思路。注意:是整站屏蔽,而且是盡可能的屏蔽掉所有主流搜索引擎的爬蟲(蜘蛛)。
1、通過 robots.txt 文件屏蔽
可以說 robots.txt 文件是最重要的一種渠道(能和搜索引擎建立直接對話),給出以下建議:
User-agent: Baispider
Disallow: /
User-agent: Googlebot
Disallow: /
User-agent: Googlebot-Mobile
Disallow: /
User-agent: Googlebot-Image
Disallow:/
User-agent: Mediapartners-Google
Disallow: /
User-agent: Adsbot-Google
Disallow: /
User-agent:Feedfetcher-Google
Disallow: /
User-agent: Yahoo! Slurp
Disallow: /
User-agent: Yahoo! Slurp China
Disallow: /
User-agent: Yahoo!-AdCrawler
Disallow: /
User-agent: YouBot
Disallow: /
User-agent: Sosospider
Disallow: /
User-agent: Sogou spider
Disallow: /
User-agent: Sogou web spider
Disallow: /
User-agent: MSNBot
Disallow: /
User-agent: ia_archiver
Disallow: /
User-agent: Tomato Bot
Disallow: /
User-agent: *
Disallow: /
2、通過 meta tag 屏蔽
在所有的網頁頭部文件添加,添加如下語句:
<meta name="robots" content="noindex, nofollow">
3、通過伺服器(如:Linux/nginx )配置文件設置
直接過濾 spider/robots 的IP 段。
小註:第1招和第2招只對「君子」有效,防止「小人」要用到第3招(「君子」和「小人」分別泛指指遵守與不遵守 robots.txt 協議的 spider/robots),所以網站上線之後要不斷跟蹤分析日誌,篩選出這些 badbot 的ip,然後屏蔽之。
G. 網路爬蟲可以採用的搜索方法
1.人為給定一個URL作為入口網頁,數據的爬取從這里開始。
2.分別用抓取隊列和完成隊列來保存處於不同狀態的鏈接。
3.爬蟲程序從抓取隊列讀取隊首URL,如果存在,則繼續執行下去,否則停止爬取。
4.每處理完一個URL,將其放入完成隊列,防止網頁的重復訪問。
5.每次抓取網頁之後分析其中的URL,將經過過濾的合法鏈接寫入完成隊列,等待查詢。
6.重復步驟3-5直至滿足結束條件。
H. python爬蟲網站的登錄url怎麼找
抓取網頁所有url的簡單Python爬蟲源碼,只用到了一個Python標准庫urllib模塊,沒有用BeautifulSoup第三方庫。python 多線程爬蟲是一個很實用的工具。
Python爬蟲源碼發,如下:
import urllib
content = urllib.urlopen('http://www.iplaypython.com/').read()
s1=0
while s1>=0:
begin = content.find(r'<a',s1) m1="content.find(r'" href=",begin)
m2 = content.find(r">',m1)
s1 = m2
if(begin<=0):
break
elif(content[m1:m2].find(r" ")!=-1):
m2 = content[m1:m2].find(r' ')
url = content[m1+6:m1+m2-1]
print url
elif m2>=0:
url = content[m1+6:m2-1]
print url
print "end."
</a',s1)>
I. Web網站如何查看搜索引擎蜘蛛爬蟲的行為
查看網站日誌文件就可以了