使用用户名和密码登录后如何抓取网站
Posted
技术标签:
【中文标题】使用用户名和密码登录后如何抓取网站【英文标题】:How to crawl a website after login in it with username and password 【发布时间】:2015-03-22 12:15:25 【问题描述】:我编写了一个网络爬虫,它使用 keyward 爬取网站,但我想登录到我指定的网站并按关键字过滤信息。如何实现这一点。到目前为止,我已经发布了我的代码。
public class DB
public Connection conn = null;
public DB()
try
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/test";
conn = DriverManager.getConnection(url, "root","root");
System.out.println("conn built");
catch (SQLException e)
e.printStackTrace();
catch (ClassNotFoundException e)
e.printStackTrace();
public ResultSet runSql(String sql) throws SQLException
Statement sta = conn.createStatement();
return sta.executeQuery(sql);
public boolean runSql2(String sql) throws SQLException
Statement sta = conn.createStatement();
return sta.execute(sql);
@Override
protected void finalize() throws Throwable
if (conn != null || !conn.isClosed())
conn.close();
public class Main
public static DB db = new DB();
public static void main(String[] args) throws SQLException, IOException
db.runSql2("TRUNCATE Record;");
processPage("http://m.naukri.com/login");
public static void processPage(String URL) throws SQLException, IOException
//check if the given URL is already in database;
String sql = "select * from Record where URL = '"+URL+"'";
ResultSet rs = db.runSql(sql);
if(rs.next())
else
//store the URL to database to avoid parsing again
sql = "INSERT INTO `test`.`Record` " + "(`URL`) VALUES " + "(?);";
PreparedStatement stmt = db.conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
stmt.setString(1, URL);
stmt.execute();
//get useful information
Connection.Response res = Jsoup.connect("http://www.naukri.com/").data("username","jeet.chatterjee.88@gmail.com","password","Letmein321")
.method(Method.POST)
.execute();
//http://m.naukri.com/login
Map<String, String> loginCookies = res.cookies();
Document doc = Jsoup.connect("http://m.naukri.com/login")
.cookies(loginCookies)
.get();
if(doc.text().contains(""))
System.out.println(URL);
//get all links and recursively call the processPage method
Elements questions = doc.select("a[href]");
for(Element link: questions)
if(link.attr("abs:href").contains("naukri.com"))
processPage(link.attr("abs:href"));
还有表结构
CREATE TABLE IF NOT EXISTS `Record` (
`RecordID` INT(11) NOT NULL AUTO_INCREMENT,
`URL` text NOT NULL,
PRIMARY KEY (`RecordID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
现在我想使用我的用户名和密码进行爬取,以便爬虫可以动态登录网站并根据关键字爬取信息.. 假设我的用户名是 lucifer,密码是 lucifer123
【问题讨论】:
见***.com/questions/3804209/… 然后看到***.com/questions/6432970/jsoup-posting-and-cookie 我尝试过 Document doc = Jsoup.connect("m.nki.com/…; 但仍然无法登录该站点 当我尝试该代码时,网站给了我两个 URL,一个用于忘记密码,另一个用于注册 谁能告诉我哪里做错了?? 【参考方案1】:您的方法是用于无状态 Web 访问,这通常适用于 Web 服务。网站是有状态的。您进行一次身份验证,然后他们使用存储在您的 cookie 中的会话密钥对您进行身份验证(其他身份验证方式也是可能的),因此它是必需的。您必须发送浏览器发送的参数。尝试使用 firebug 监控您的浏览器发送到站点的内容,并在您的代码中重现它
--更新--
Jsoup.connect("url")
.cookie("cookie-name", "cookie-value")
.header("header-name", "header-value")
.data("data-name","data-value");
你可以添加多个cookie |标题 |数据。并且有从Map
添加值的功能。
要找出必须设置的内容,请将 fire bug 添加到您的浏览器,它们都有默认的开发者控制台,可以使用F12
启动。转到您想要获取数据的 url,然后将其中的所有内容添加到您的 jsoup 请求中。
我从您的网站结果中添加了一些图片
我用红色标记了重要的部分。
您可以通过将这些信息发送到站点并从中获取 cookie 并在获取 response.cookies 后将这些 cookie 附加到您提出的每个请求中,从而在您的代码中获取所需的 cookie ;)
p.s:更改密码 A.S.A.P
【讨论】:
我没有完成get u,你能给我举个例子吗? @alizezele 我会试试你的代码,谢谢你的回复..顺便说一句,你能用我的凭据登录那个网站吗?? 您的登录信息都在Jsoup.connect("http://www.naukri.com/").data("username","jeet.chatterjee.88@gmail.com","password","Letmein321")
中,所以登录并不难;)。顺便说一句,我再次测试并更改密码(希望由您更改)
是的,我只是问你能用我的代码登录网站吗?我在问手动登录
您的代码完全错误。检查登录的 url 不是主页。它是/nlogin/login.php
。我还没有尝试过你的代码,但我很确定不会工作;)以上是关于使用用户名和密码登录后如何抓取网站的主要内容,如果未能解决你的问题,请参考以下文章