使用用户名和密码登录后如何抓取网站

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。我还没有尝试过你的代码,但我很确定不会工作;)

以上是关于使用用户名和密码登录后如何抓取网站的主要内容,如果未能解决你的问题,请参考以下文章

使用安全登录抓取网站内容

通过 Python 中的网络抓取工具登录网站

如何抓取Android系统APP测试的日志

基于puppeteer模拟登录抓取页面

centos6.x 抓取ssh登录的用户名和密码

如何在用户名/密码和谷歌登录中验证和授权用户?