2024-08-16

要爬取需要登录的网站,通常需要处理登录过程,获取登录后的数据。以下是一个使用Python的requests库和BeautifulSoup库进行登录并爬取数据的基本示例。




import requests
from bs4 import BeautifulSoup
 
# 目标网站的登录URL
login_url = 'https://example.com/login'
 
# 登录需要的用户名和密码
login_data = {
    'username': 'your_username',
    'password': 'your_password'
}
 
# 创建一个Session对象,以便能够保持登录状态
session = requests.Session()
 
# 发送登录请求
response = session.post(login_url, data=login_data)
 
# 检查是否登录成功
if response.ok:
    print('登录成功')
 
    # 目标网站的数据URL
    target_url = 'https://example.com/data'
 
    # 获取目标网站的数据
    target_response = session.get(target_url)
 
    # 解析数据
    soup = BeautifulSoup(target_response.text, 'html.parser')
 
    # 提取需要的数据
    # 例如,提取所有的段落
    for p in soup.find_all('p'):
        print(p.text)
 
else:
    print('登录失败')

请注意,实际的登录URL、登录数据、目标URL和解析方法都需要根据你要爬取的具体网站进行调整。

此外,很多网站可能需要处理验证码、CSRF token等安全措施,这就需要你在登录前进行相应的处理。

如果网站使用了JavaScript动态渲染,可能需要使用如Selenium等工具来进行爬取。

这只是一个基本的示例,实际应用中可能需要更复杂的处理,例如处理cookies、headers、代理、异常处理等。

2024-08-16



import requests
from bs4 import BeautifulSoup
import re
import pandas as pd
 
# 设置请求头,模拟浏览器访问
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3'}
 
# 获取微博用户主页的网页内容
def get_page_content(url):
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except requests.RequestException:
        return None
 
# 解析微博数据,提取微博正文
def parse_weibo_data(html):
    soup = BeautifulSoup(html, 'lxml')
    weibo_data = []
    for container in soup.find_all('div', class_='c'):
        weibo = {}
        # 提取微博正文
        text = container.find('span', class_='ctt')
        if text:
            weibo['text'] = text.text.strip()
        else:
            continue
        # 提取转发数和评论数
        for info in container.find_all('span', class_='cc'):
            if '转发' in info.text:
                weibo['retweet_count'] = re.search('\d+', info.text).group(0)
            elif '评论' in info.text:
                weibo['comment_count'] = re.search('\d+', info.text).group(0)
        weibo_data.append(weibo)
    return weibo_data
 
# 保存微博数据到CSV文件
def save_weibo_data_to_csv(weibo_data, file_name):
    df = pd.DataFrame(weibo_data)
    df.to_csv(file_name + '.csv', index=False, encoding='utf-8-sig')
 
# 主函数
def main(user_id, since_date, count):
    url = f'https://weibo.com/p/100505{user_id}/home?is_search=0&visible=0&is_all=1&since_id=0&sort=time&page={count}'
    html = get_page_content(url)
    if html:
        weibo_data = parse_weibo_data(html)
        save_weibo_data_to_csv(weibo_data, f'weibo_data_{user_id}_{since_date}_{count}')
        print(f'微博数据已保存到 weibo_data_{user_id}_{since_date}_{count}.csv')
    else:
        print('网页内容获取失败')
 
# 示例用户ID为1234567890,起始日期为2023-01-01,爬取第1页的数据
main(1234567890, '2023-01-01', 1)

在这个代码示例中,我们定义了一个main函数,它接受用户ID、起始日期和页数作为参数,并将微博数据保存到CSV文件中。这个示例展示了如何使用Python进行网络爬取,提取特定的数据,并将其保存到文件中。需要注意

2024-08-16



import requests
from lxml import etree
 
class TianMaoSpider:
    def __init__(self, keyword, page_num):
        self.keyword = keyword
        self.page_num = page_num
        self.base_url = "https://s.taobao.com/search?q="
 
    def get_response(self, url):
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"}
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
 
    def parse_page(self, page_url):
        html = self.get_response(page_url)
        if html:
            parser = etree.HTML(html)
            items = parser.xpath('//div[@class="item J_MouserOnverReq  "]')
            for item in items:
                title = item.xpath('.//div[@class="title"]/a/text()')[0]
                price = item.xpath('.//div[@class="price"]/strong/text()')[0]
                print(f"商品名称: {title}, 价格: {price}")
 
    def run(self):
        for page in range(1, self.page_num + 1):
            page_url = f"{self.base_url}{self.keyword}&s={(page-1)*44}"
            self.parse_page(page_url)
 
if __name__ == "__main__":
    spider = TianMaoSpider("口罩", 2)
    spider.run()

这段代码实现了一个简单的天猫商品数据爬虫。首先定义了一个TianMaoSpider类,包含初始化方法、获取响应、解析页面和运行爬虫的方法。在__init__方法中,设置了搜索关键词和需要爬取的页数。get_response方法用于发送请求并获取响应。parse_page方法解析页面,提取商品标题和价格,并打印输出。最后,在run方法中通过循环遍历页面,并调用parse_page方法来爬取数据。这个简单的爬虫示例教会了如何使用Python进行基本的网页爬取。

2024-08-16



import requests
from bs4 import BeautifulSoup
import re
 
# 定义函数来下载和保存小说内容
def download_novel(url, title):
    response = requests.get(url)
    if response.status_code == 200:
        soup = BeautifulSoup(response.text, 'lxml')
        content = soup.find('div', class_='content').text
        content = re.sub(r'\s+', '\n\n', content)  # 将连续空格替换为换行符
        with open(f'{title}.txt', 'w', encoding='utf-8') as file:
            file.write(content)
 
# 主函数,用于控制流程
def main():
    url = 'https://www.zlibrary.org/works/2012351741104177616.html'  # 小说的URL
    title = 'A Rising Tide'  # 小说的标题
    download_novel(url, title)
 
if __name__ == '__main__':
    main()

这段代码使用了requests库来发送HTTP请求,使用BeautifulSoup库来解析HTML,使用正则表达式re来处理文本数据。代码首先定义了一个函数download_novel,它接受小说的URL和标题作为参数,然后发送请求,解析页面,提取小说内容,并将其保存为.txt文件。主函数main控制了程序的流程,调用download_novel函数来执行下载和保存操作。

2024-08-16

为了模拟登录,你需要使用Python的requests库来发送HTTP请求,并处理cookies和session对象。以下是一个模拟登录的基本例子:




import requests
 
# 登录的URL
login_url = 'http://example.com/login'
 
# 创建一个Session对象,以便能够保持会话状态
session = requests.Session()
 
# 登录需要的参数,比如用户名和密码
login_params = {
    'username': 'your_username',
    'password': 'your_password'
}
 
# 发送POST请求进行登录
response = session.post(login_url, data=login_params)
 
# 检查是否登录成功
if response.ok:
    print('登录成功')
    # 登录成功后,可以继续使用session对象来发送后续请求
    # 例如获取用户的个人信息
    user_url = 'http://example.com/user'
    user_response = session.get(user_url)
    if user_response.ok:
        print('用户信息:', user_response.text)
    else:
        print('获取用户信息失败')
else:
    print('登录失败')

请注意,实际的登录可能涉及到处理cookies、CSRF tokens、headers等安全措施,可能需要你手动处理或者使用专门的库来帮助你完成。上面的代码只是一个简单的例子,实际使用时需要根据目标网站的具体情况进行调整。

2024-08-16

Puppeteer 是一个 Node 库,它提供了高级 API 来控制 Chrome 或 Chromium。如果你能用 Puppeteer 做爬虫,说明你已经掌握了这个工具的基本使用。

以下是一个简单的使用 Puppeteer 进行网页抓取的例子:




const puppeteer = require('puppeteer');
 
async function fetchHTML(url) {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto(url);
    const html = await page.evaluate(() => document.body.innerHTML);
    browser.close();
    return html;
}
 
// 使用方法:
fetchHTML('https://example.com').then(html => console.log(html));

这段代码会启动一个新的浏览器实例,打开一个新页面,访问指定的 URL,然后获取页面的 HTML 内容,并在浏览器实例关闭后返回。这是一个非常基础的爬虫示例,实际的爬虫可能需要处理更复杂的情况,比如需要登录、处理 AJAX 请求、应对反爬虫策略等。

2024-08-16



const puppeteer = require('puppeteer');
 
async function crawlWithPuppeteer(url) {
    // 启动浏览器
    const browser = await puppeteer.launch();
    // 打开新页面
    const page = await browser.newPage();
    // 导航到URL
    await page.goto(url);
    // 等待内容加载完成
    await page.waitForSelector('body');
 
    // 提取页面标题
    const title = await page.title();
    console.log('页面标题:', title);
 
    // 关闭浏览器
    await browser.close();
}
 
// 使用方法: crawlWithPuppeteer('https://example.com');

这段代码演示了如何使用Puppeteer启动一个浏览器实例,打开一个新页面,导航到指定的URL,并等待页面加载。然后它提取页面标题并在控制台输出,最后关闭浏览器。这是爬虫过程中的一个基本步骤,可以扩展以抓取更多的数据。

2024-08-16



import requests
from bs4 import BeautifulSoup
import time
import random
import csv
 
def get_html(url, headers):
    try:
        response = requests.get(url, headers=headers)
        if response.status_code == 200:
            return response.text
        return None
    except requests.RequestException:
        return None
 
def parse_html(html, keyword):
    soup = BeautifulSoup(html, 'lxml')
    news_list = soup.select('div.news-box > ul > li > a')
    for news in news_list:
        title = news.select_one('h3').text
        if keyword.lower() in title.lower():
            url = news['href']
            print(f'正在爬取新闻: {title}')
            yield url
 
def get_news_detail(url, headers):
    html = get_html(url, headers)
    soup = BeautifulSoup(html, 'lxml')
    content = soup.select_one('div.article-content').text
    return content
 
def save_to_csv(data, filename):
    with open(filename, 'a', newline='', encoding='utf-8') as f:
        writer = csv.writer(f)
        writer.writerow(data)
 
def main(keyword):
    base_url = 'https://news.sina.com.cn/china/'
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3',
        'Cookie': 'your_cookie_here'
    }
    filename = f'{keyword}_news.csv'
    for url in parse_html(get_html(base_url, headers), keyword):
        content = get_news_detail(url, headers)
        save_to_csv([url, content], filename)
        time.sleep(random.uniform(1, 3))  # 添加随机等待防止被封禁IP
 
if __name__ == '__main__':
    keyword = '科技'
    main(keyword)

这段代码实现了一个简单的深度爬虫,它首先获取新闻列表页面的HTML内容,然后解析提取新闻标题和URL,筛选含有指定关键词的新闻,并将新闻的详情页URL交给一个新的函数来获取新闻详情。新闻详情被获取后,保存到CSV文件中。为了避免被目标网站封禁,爬虫在请求新的URL之前引入随机的等待时间。

2024-08-16



import requests
from bs4 import BeautifulSoup
 
def crawl_google(query, num_results=10):
    base_url = "https://www.google.com/search?q={query}&num={num}"
    params = {
        "query": query.replace(' ', '+'),
        "num": num_results
    }
    url = base_url.format(**params)
    headers = {
        "User-Agent": "Mozilla/5.0",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
    }
    response = requests.get(url, headers=headers)
    return response.text
 
def crawl_bing(query, num_results=10):
    base_url = "https://www.bing.com/search?q={query}&count={num}"
    params = {
        "query": query.replace(' ', '+'),
        "num": num_results
    }
    url = base_url.format(**params)
    headers = {
        "User-Agent": "Mozilla/5.0",
        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9"
    }
    response = requests.get(url, headers=headers)
    return response.text
 
def parse_results(html_content, engine='Google'):
    soup = BeautifulSoup(html_content, 'html.parser')
    results = soup.find_all('div', class_='r') if engine == 'Google' else soup.find_all('li', class_='b_algo')
    parsed_results = []
    for result in results:
        link = result.find('a')
        if link:
            title = link.text
            href = link['href']
            parsed_results.append({'title': title, 'link': href})
    return parsed_results
 
# 使用示例
google_results = parse_results(crawl_google('Python'), engine='Google')
bing_results = parse_results(crawl_bing('Python'), engine='Bing')
 
print("Google Results:")
for result in google_results:
    print(f"Title: {result['title']}, Link: {result['link']}")
 
print("\nBing Results:")
for result in bing_results:
    print(f"Title: {result['title']}, Link: {result['link']}")

这段代码定义了两个函数crawl_googlecrawl_bing来分别爬取Google和Bing的搜索结果,然后定义了一个parse_results函数来解析返回的HTML内容,提取出搜索结果的标题和链接。最后,我们使用这些函数来爬取"Python"作为关键词的搜索结果,并打印出来。这个例子展示了如何使用Python进行基本的网络爬虫,并且说明了如何处理动态内容和反爬虫策略。

2024-08-16

要实现一个基于JavaScript的爬虫逆向-x粒纯算的功能,你可以使用JavaScript的正则表达式和字符串处理能力来实现。以下是一个简单的示例,它尝试找到一个给定字符串中的所有数字,并将它们相加得到一个总和。




function crawlerReverseXor(input) {
  // 使用正则表达式匹配所有的数字
  const numbers = input.match(/\d+/g) || [];
  
  // 使用reduce方法累加所有数字
  const sum = numbers.reduce((accumulator, currentValue) => {
    return accumulator + parseInt(currentValue, 10);
  }, 0);
  
  return sum;
}
 
// 示例输入
const input = "算法100与编程语言200";
// 调用函数并输出结果
console.log(crawlerReverseXor(input)); // 输出可能是300,具体取决于字符串中的数字是否都参与计算

这个函数crawlerReverseXor接收一个字符串作为输入,使用正则表达式\d+来匹配所有的数字,然后使用Array.prototype.reduce方法来累加这些数字的和。

请注意,这个示例假设了输入字符串中的数字都是要参与计算的。如果实际应用中数字的参与计算与否有更复杂的规则,那么正则表达式或累加逻辑需要相应地调整。