Skip to main content

Extracting Device Name from Model using Python Scraping

I am attempting to scrape device information from a specific website (gsmarena) based on its model number. I would like to extract the model name (and eventually price). I'm using a headless browser and rotating proxies to do so, but have had little success in extracting the info. required for ~2000 devices (am able to extract roughly 10 before all IPs blocked).

The (~200) proxies are obtained from https://free-proxy-list.net/, which seem to contain a few that work.

I've explored a number of different options but have had little success. Below is the code I'm currently running- any help would be appreciated.

def get_device_name(device_model, proxies_list):

# Check if the device model is provided, return None if not
if device_model is None:
    return None

# Create a list for storing working proxies
working_proxies = list(proxies_list)

# Start a web driver instance
attempts = 0
while attempts < len(working_proxies):
    proxy = working_proxies[attempts]
    print(proxy)
    try:
        # Set options for the web driver
        options = webdriver.ChromeOptions()
        options.add_argument(f'--proxy-server={proxy}')
        options.add_argument('--headless')
        options.add_argument('--disable-gpu')
        options.add_argument('--no-sandbox')
        options.add_argument('--disable-dev-shm-usage')
        driver = webdriver.Chrome(options=options)

        # Make the request to the website
        url = 'https://www.gsmarena.com/res.php3?sSearch=' + device_model
        driver.get(url)

        # Wait 5 seconds before making another request
        time.sleep(5)

        # Find the device name on the page
        device_name = driver.find_element(By.TAG_NAME, 'strong').text.replace("\n"," ")
        driver.close()
        print(device_name)
        return device_name
    except Exception:
        # If an exception is raised, increment attempts and remove the failed proxy
        attempts += 1
        print("Attempt {} with proxy {} failed. Trying again with a different proxy...".format(attempts, proxy))
        proxies_list.remove(proxy)
        print("Proxy {} removed.".format(proxy))
        continue

# Return None if all attempts failed
print("All attempts failed. Unable to get device name.")
return None

Apply the get_device_name function to the device_model column of user_agents_2

user_agents_3 = user_agents_2 user_agents_3['device_name'] = user_agents_2['device_model'].apply(get_device_name, proxies_list=proxies_list) 
print(user_agents_3)


source https://stackoverflow.com/questions/75849946/extracting-device-name-from-model-using-python-scraping

Comments

Popular posts from this blog

Prop `className` did not match in next js app

I have written a sample code ( Github Link here ). this is a simple next js app, but giving me error when I refresh the page. This seems to be the common problem and I tried the fix provided in the internet but does not seem to fix my issue. The error is Warning: Prop className did not match. Server: "MuiBox-root MuiBox-root-1" Client: "MuiBox-root MuiBox-root-2". Did changes for _document.js, modified _app.js as mentioned in official website and solutions in stackoverflow. but nothing seems to work. Could someone take a look and help me whats wrong with the code? Via Active questions tagged javascript - Stack Overflow https://ift.tt/2FdjaAW

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console