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网站如何查看搜索引擎蜘蛛爬虫的行为
查看网站日志文件就可以了